Несколько советов по bash

King аватар

Почитывая блог своего знаменитого приятеля, наткнулся на эту статью Несколько советов по bash и не удержался, чтобы самым бесцеремонным образом ее не сплагиатировать на свой сайт
Разумеется, немного дополнив ее своими заметками.


Несколько советов по bash

Тут приведены некоторые полезные хитрости, направленные на более удобное использование командной строки. Все мы не хотим повторно набирать какую-то длинную команду и ищем ее в истории. Тут – пара трюков от том, как можно энто самое удобство малость повысить.

1. Потеря команд в .history
Многие пользуются стандартными гномовским или кдешным эмуляторами терминала. У них есть возможность открывать в одном окне несколько оболочек – каждую в отдельной вкладке.

bash по умолчанию пишет в историю набранные за сеанс команды только при своем закрытии (перед самоликвидацией). Поэтому при открытии нового терминала в другой вкладке вы не увидите только что набранные команды из первой вкладки – они еще не записаны в хистори.

К тому же закрыв первый терминал, а потом второй вы не найдете в истории команд набранных в первом терминале. Потому что по умолчанию bash не дописывает файл .history, а переписывает.

Исправить ситуацию можно, дописав в конфигурационный файл ~/.bashrc пару строк

  1. shopt -s histappend
  2. PROMPT_COMMAND='history -a'

Теперь каждая введенная вами команда будет писаться в историю сразу же. Не бойтесь – дырку на жестком месте такая конфигурация не протрет. Не так уж часто вы команды в баше набираете. Да и слава богу кеширование дисков пока еще рулит.

2. Эвристическое исправление ошибок директорий
Если дописать такую строчку

  1. shopt -s cdspell

то bash будет пытаться исправлять допущенные вами опечатки (пропуски и перестановки символов, например /ect/init.d вместо /etc/init.d) в пути у команды cd. Не бойтесь, у rm такая фича работать уже не будет. Только у cd.

3. Не писать в историю подряд идущие строки-дубликаты
Пишем в ~/.bashrc

  1. export HISTCONTROL="ignoredups"

А если вы не хотите, чтобы в историю попадали вызовы каких-то “неинформативных” команд, то их логирование можно запретить:

  1. export HISTIGNORE="&:ls:[bf]g:exit"

После этой команды в хистори не будут писаться команды &, ls, bg, fg, exit. Можно дописать и свои, через двоеточие, можно использовать шаблоны.

4. Не разрывать многострочные команды
Еще команда в конфигурационный файл

  1. shopt -s cmdhist

5. Поиск по истории команд
Иногда команды бывают большими и сложными, и чтобы заново ее не писать и не искать по истории 100 раз нажимая “вверх”, можно воспользоваться поиском.

Если вы помните кусочек команды которую хотите найти, то можно просто нажать в bash’e комбинацию Ctrl + R и набрать этот кусочек. bash вам покажет последнюю команду с такой подстрокой. Можно продолжать нажимать Ctrl + R и bash будет выдавать более старые подходящие команды, подходящие под искомую строку.

6. Вернуться в предыдущую директорию
Когда мы работаем в какой-то директории, и нам нужно “выбраться” в другую директорию, что-то там поделать и вернуться назад, можно воспользоваться “cd -”, например

  1. [kpblca@localhost html]$ cd /var/www/html
  2. [kpblca@localhost html]$ cd /etc/
  3. [kpblca@localhost etc]$ vi my.cnf
  4. [kpblca@localhost etc]$ cd -
  5. /var/www/html
  6. [kpblca@localhost html]$

Эта команда вернет нас в директорию где мы были раньше.

PS. Дополнительно можно почитать man bash и найти там описание всех опций у shopt. Может быть еще что-то вам тоже пригодится.

7. Поиск по истории команд

Создаём в домашней папке пользователя скрытый файл .inputrc следующего содержания:

  1. "\e[A": history-search-backward
  2. "\e[B": history-search-forward

Набираем начало любой команды, жмём кнопочку Вверх - находится первая команда, еще раз - следующая. Намного удобнее чем искать комбинацией Ctrl+R.

8. Как хранить дату выполнения в истории команд bash (автор kpblca)
По умолчанию bash, а точнее егойная утилита history, не сохраняет в .bash_history время исполнения каждой команды.

Почитал маны и оказалось, что в баше третьей версии сделать это можно и весьма просто. Если объявить глобальную переменную HISTTIMEFORMAT с форматом выводимых данных, то утилита history будет сохранять и выводить эту дату.

Итак, пишем в ~/.bashrc строчку

  1. export HISTTIMEFORMAT='%h %d %H:%M:%S '

После этого в .bash_history перед каждой командой появится коментарий с цифрой - временем выполнения этой команды в формате timestamp:

  1. #1198068550
  2. history
  3. #1198139874
  4. ьс
  5. #1198139876
  6. mc
  7. #1198148168
  8. ssh teletrade.ru
  9. #1198148217
  10. ssh teletrade.ru

А командочка history будет выдавать историю данных с датой в формате, который мы переменной задали (в похожем формате выдают дату и время утилита ls):

  1.   995  Дек 19 15:49:10 history
  2.   996  Дек 20 11:37:54 ьс
  3.   997  Дек 20 11:37:56 mc
  4.   998  Дек 20 13:55:49 ssh teletrade.ru

Но можно сделать и по ГОСТУ, в приятном русскому глазу виде "ДД.ММ.ГГГГ"

  1. export HISTTIMEFORMAT='%d.%m.%Y %H:%M:%S '

А можно и на американский манер "YYYY-MM-DD"

  1. export HISTTIMEFORMAT='%Y-%m-%d %H:%M:%S '

То, чего сам когда-то хотел, в реализации оказалось очень тупо и просто (правда работает это только начиная с bash 3). А тут в коментарии в блоге человек спросил как сие сделать - я порылся в манах, за пару минут решение нашел.


Ещё множество идей для тюнинга командной строки можно почерпнуть из статьи Редактирование командной строки
Ваша оценка: Ничего Средняя оценка: 9.5 (17 votes)

А можно и на американский манер "YYYY-MM-DD"

Это дата в стандарте ISO и заокеанские жители тут непричём. Такой формат удобен тем, что сортировка, к примеру, по дате пройдёт корректно в любых алгоритмах.

RSS-материал