Трюки bash

Документация связанная с установкой, настройкой и работой пользовательского ПО
Post Reply
User avatar
Raven
Бородатый сис
Бородатый сис
Posts: 2794
Joined: 03 Mar 2010, 15:12
ОС: RHEL 8
Location: Из серверной

Трюки bash

Post by Raven » 17 Sep 2010, 15:04

История и bang-bang

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

Code: Select all

  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) означает последний аргумент последней команды.
К примеру тут:

Code: Select all

!$ /some/long/path/to/dir/
rm -rf !$
!$ превратится в /some/long/path/to/dir/.

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

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

Шапочки

Наверняка вы не раз вводили что-то типа

Code: Select all

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

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

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

Полезно дать короткие имена часто используемым командам. Также полезно дать алиасы наиболее частым опечаткам.
Полезными алиасами могут быть:

Code: Select all

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'
Я не злопамятный, я просто часто ковыряю логи
User avatar
Gen1us2k
Модератор
Модератор
Posts: 771
Joined: 02 Mar 2010, 16:13

Re: Трюки bash

Post by Gen1us2k » 18 Sep 2010, 12:44

mkdir {test,testlolo,test/lolo}
создаст сразу столько папочек :)
Image
Home: Windows Heaven
Home: Debian 6
For Servers: Debian || RHEL Based || Gentoo || FreeBSD
User avatar
Gen1us2k
Модератор
Модератор
Posts: 771
Joined: 02 Mar 2010, 16:13

Re: Трюки bash

Post by Gen1us2k » 27 Sep 2010, 15:06

Code: Select all

rm -f !(survivior.txt)
удалить все, кроме survivior.txt
find . ! -name <FILENAME> -delete
тоже самое

Code: Select all

ls | grep -v "filename$" | xargs rm -v
тоже самое
Image
Home: Windows Heaven
Home: Debian 6
For Servers: Debian || RHEL Based || Gentoo || FreeBSD
User avatar
Gen1us2k
Модератор
Модератор
Posts: 771
Joined: 02 Mar 2010, 16:13

Re: Трюки bash

Post by Gen1us2k » 31 Oct 2010, 23:12

for i in foo*.JPG; do NUMBER=`ls $i|sed 's/[^0-9]//g'`; mv -v $i angels$NUMBER.jpg; done
как вариант групповой переименовки файлов
Image
Home: Windows Heaven
Home: Debian 6
For Servers: Debian || RHEL Based || Gentoo || FreeBSD
Post Reply

Return to “Документация *nix”