2008-08-25

Трюки bash

История и bang-bang


История команд - очень удобный инструмент. С помощью стрелок вверх-вниз можно перемещаться по истории введенных команд. Кроме того, с помощью команды history можно просмотреть всю историю команд:

190  ps axu | grep htt
  191  /www/bin/apachectl start
  192  vi /usr/local/lib/php.ini 
  193  cat /www/logs/error_log 
  194  ps -auxw | grep http
  195  pwd

Ничего удивительного.
Гораздо интереснее то, что называется bang-bang, или команда !!. `!!` означает последнюю команду в истории. Т.е. ввод !! в данном случае аналогичен pwd.
Но и это еще не все. Можно ввести `!<первые буквы команды>`. `!ps` вызовет `ps axu | grep htt`. Но будьте внимательны и сообщайте восклицательному знаку достаточно символов команды. Например !p в данном случае будет аналогично `pwd`, а не `ps axu | grep htt` (поскольку pwd ниже в истории) как возможно хотелось бы.



:p не просто смайлик


Для того чтобы избежать конфузов при использовании ! можно добавлять к нему смайлик :p. Это заставит bash вывести то, что он собирался выполнить. Кроме того, :p достаточно умен для того, чтобы добавить выведенную команду в историю.

В качестве примера:
!ps:p в нашем случае вернет "ps axu | grep htt". Убедившись что это именно то что нужно, можно ввести !! и bash выполнит `ps axu | grep htt`.

Другие способы использования истории


Наверное самый примитивный способ - вызвать команду history, узнав номер необходимой команды, а затем использовать !N, где N - номер команды в истории (например, !192). Не следует пренебрегать этой возможностью. Иногда запомнить !123 для какой-то постоянно нужной команды гораздо проще чем пользоваться другими способами.
Кстати, :p работает и тут.

Еще один удобный способ - нажать ^r (Ctrl-r) и начать вводить первые символы нужной команды. bash будет искать в истории подходящие команды.

Работа с аргументами


!$ (bang-dollar) означает последний аргумент последней команды.
К примеру тут:
ls /some/long/path/to/dir/
rm -rf !$
!$ превратится в /some/long/path/to/dir/.

Кстати, :p тут тоже работает.

!* похожа на !$. !* превращается во все аргументы последней команды.

Шапочки


Наверняка вы не раз вводили что-то типа
vi /etc/X22/xorg.conf
Это очень легко поправить с помощью шляпок:
^22^11 заменяет 22 на 11 в предыдущей команде. По аналогии всегда можно использовать ^ошибка^исправление.

Автодополнение


Ну и разумеется не стоит забывать про автодополнение. Один Tab дополняет команду насколько можно понять, второй выводит все варианты дальнейшего написания. Однако не следует этим злоупотреблять. Согласитесь, написать less быстрее, чем написать le и долбить по табу.

Алиасы


Полезно дать короткие имена часто используемым командам. Также полезно дать алиасы наиболее частым опечаткам.
Полезными алиасами могут быть:
alias ls='ls --color=auto'
alias mroe='more'
alias H='kill -HUP'
alias ssh-production='ssh www.myproject.com'
alias ssh-qa='ssh qa.myproject.com'
alias sl='ls'

© Deadman.org