Тут приведены некоторые полезные хитрости, направленные на более удобное использование командной строки. Все мы не хотим повторно набирать какую-то длинную команду и ищем ее в истории. Тут — пара трюков от том, как можно энто самое удобство малость повысить.
1. Потеря комманд в .bash_history
Многие пользуются стандартными гномовским или кдешным эмуляторами терминала. У них есть возможность открывать в одном окне несколько оболочек — каждую в отдельной вкладке.
bash по умолчанию пишет в историю набранные за сеанс команды только при своем закрытии (перед самоликвидацией). Поэтому при открытии нового терминала в другой вкладке вы не увидите только что набранные команды из первой вкладки — они еще не записаны в хистори.
К тому же закрыв первый терминал, а потом второй вы не найдете в истории команд набранных в первом терминале. Потому что по умолчанию bash не дописывает файл .history, а переписывает.
Исправить ситуацию можно, дописав в конфигурационный файл ~/.bashrc пару строк
shopt -s histappend PROMPT_COMMAND='history -a'
Теперь каждая введенная вами команда будет писаться в историю сразу же. Не бойтесь — дырку на жестком месте такая конфигурация не протрет. Не так уж часто вы команды в баше набираете. 🙂 Да и слава богу кеширование дисков пока еще рулит.
2. Эвристическое исправление ошибок директорий
Если дописать такую строчку
shopt -s cdspell
то bash будет пытаться исправлять допущенные вами опечатки (пропуски и перестановки символов, например /ect/init.d вместо /etc/init.d) в пути у команды cd. Не бойтесь, у rm такая фича работать уже не будет. Только у cd.
3. Не писать в историю подряд идущие строки-дубликаты
Пишем в ~/.bashrc
export HISTCONTROL="ignoredups"
А если вы не хотите, чтобы в историю попадали вызовы каких-то «неинформативных» команд, то их логирование можно запретить:
export HISTIGNORE="&:ls:[bf]g:exit"
После этой команды в хистори не будут писаться команды &, ls, bg, fg, exit. Можно дописать и свои, через двоеточие, можно использовать шаблоны.
4. Не разрывать многострочные команды
Еще команда в конфигурационный файл
shopt -s cmdhist
5. Поиск по истории команд
Иногда команды бывают большими и сложными, и чтобы заново ее не писать и не искать по истории 100 раз нажимая «вверх», можно воспользоваться поиском.
Если вы помните кусочек команды которую хотите найти, то можно просто нажать в bash’e комбинацию Ctrl + R и набрать этот кусочек. bash вам покажет последнюю команду с такой подстрокой. Можно продолжать нажимать Ctrl + R и bash будет выдавать более старые подходящие команды, подходящие под искомую строку.
6. Вернуться в предыдущую директорию
Когда мы работаем в какой-то директории, и нам нужно «выбраться» в другую директорию, что-то там поделать и вернуться назад, можно воспользоваться «cd -«, например
[toor@localhost html]$ cd /var/www/html [toor@localhost html]$ cd /etc/ [toor@localhost etc]$ vi my.cnf [toor@localhost etc]$ cd - /var/www/html [toor@localhost html]$
Эта команда вернет нас в директорию где мы были раньше.
7. Хранить дату выполнения в истории команд bash
По умолчанию утилита history, не сохраняет в .bash_history время исполнения каждой команды.
В баше трейтьей версии сделать это можно и весьма просто. Если объявить глобальную переменную HISTTIMEFORMAT с форматом выводимых данных, то утилита history будет сохранять и выводить эту дату.
Итак, пишем в ~/.bashrc строчку
export HISTTIMEFORMAT='%h %d %H:%M:%S '
После этого в .bash_history перед каждой командой появится коментарий с цифрой — временем выполнения этой команды в формате timestamp:
#1260787129 htop #1260802594 export HISTTIMEFORMAT='%h %d %H:%M:%S ' #1260802598 history | grep squid #1260802658 mc #1260802777 chown -R svn:svn svn
А командочка history будет выдавать историю данных с датой в формате, который мы переменной задали (в похожем формате выдают дату и время утилита ls):
995 Dec 14 13:38:49 htop 996 Dec 14 17:56:34 export HISTTIMEFORMAT='%h %d %H:%M:%S ' 997 Dec 14 17:56:38 history | grep squid 998 Dec 14 17:57:38 mc 999 Dec 14 17:59:37 chown -R svn:svn svn
Но можно сделать и по ГОСТУ, в приятном русскому глазу виде «ДД.ММ.ГГГГ»
export HISTTIMEFORMAT='%d.%m.%Y %H:%M:%S '
А можно и в формате ISO: «YYYY-MM-DD»
export HISTTIMEFORMAT='%Y-%m-%d %H:%M:%S '