Трюки bash

Документация связанная с установкой, настройкой и работой пользовательского ПО
Ответить
Аватара пользователя
Raven
Бородатый сис
Бородатый сис
Сообщения: 2800
Зарегистрирован: 03 мар 2010, 15:12
ОС: RHEL 8
Откуда: Из серверной

Трюки bash

Сообщение Raven » 17 сен 2010, 15:04

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

Код: Выделить всё

!$ /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'
Я не злопамятный, я просто часто ковыряю логи
Аватара пользователя
Gen1us2k
Модератор
Модератор
Сообщения: 771
Зарегистрирован: 02 мар 2010, 16:13

Re: Трюки bash

Сообщение Gen1us2k » 18 сен 2010, 12:44

mkdir {test,testlolo,test/lolo}
создаст сразу столько папочек :)
Изображение
Home: Windows Heaven
Home: Debian 6
For Servers: Debian || RHEL Based || Gentoo || FreeBSD
Аватара пользователя
Gen1us2k
Модератор
Модератор
Сообщения: 771
Зарегистрирован: 02 мар 2010, 16:13

Re: Трюки bash

Сообщение Gen1us2k » 27 сен 2010, 15:06

Код: Выделить всё

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

Код: Выделить всё

ls | grep -v "filename$" | xargs rm -v
тоже самое
Изображение
Home: Windows Heaven
Home: Debian 6
For Servers: Debian || RHEL Based || Gentoo || FreeBSD
Аватара пользователя
Gen1us2k
Модератор
Модератор
Сообщения: 771
Зарегистрирован: 02 мар 2010, 16:13

Re: Трюки bash

Сообщение Gen1us2k » 31 окт 2010, 23:12

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

Вернуться в «Документация *nix»