Работа с историей команд в bash
Опубликовано 26.11.2007
Оригинал: bash tips and tricks
Для непосвящённых, bash — это оболочка по умолчанию во многих дистрибутивах Linux, включая Fedora, Ubuntu, Redhat и т.д. и т.п. Если вы используете ОС, основанную на Linux, есть вероятность, что вы используете именно bash. Поэтому ниже я сделал обзор некоторых часто встречающихся неудобств, а также простых способов их избежать.
1. Забытая история bash.
Если вы открыли терминал и печатаете там команды, потом открыли еще один, немного его поиспользовали, то новый терминал не «вспомнит» ни одной команды, напечатанной в первом. Вдобавок, при закрытии первого терминала второй перезапишет все команды в истории, введённые в первом. Вдвойне досадно!
Это происходит потому, что история bash сохраняется только когда вы закрываете терминал, а не после каждой команды. Чтобы исправить такое поведение, добавьте в ~/.bashrc строки:
shopt -s histappend
PROMPT_COMMAND=`history -a`
Это заставит bash дополнять историю вместо того, чтобы перезаписывать её: каждый раз, когда показывается приглашение командной строки, последняя команда добавляется в историю.
2. Опечатки в названиях каталогов при cd.
Добавьте в ваш .bashrc:
shopt -s cdspell
Теперь небольшие опечатки типа ect вместо etc будут игнорироваться.
3. Дублирующиеся команды в истории bash.
Я часто набираю cd .. много раз подряд, и потом, когда я нажимаю кнопку «вверх», чтобы возвратиться к предыдущим командам, я не хочу, чтобы мне напоминали о моих не слишком элегантных экскурсиях по файловой системе.
Добавьте в .bashrc:
export HISTCONTROL="ignoredups"
Или даже так:
export HISTIGNORE="&:ls:[bf]g:exit"
Это заставит bash игнорировать дупликаты, так же как ls, bg, fg и exit, делая историю чище.
4. Многострочные команды в истории.
Добавьте
shopt -s cmdhist
в .bashrc, тогда bash будет преобразовывать многострочные команды в одну строку для упрощения редактирования.
5. Советы из комментариев.
Нажмите Ctrl+R в bash, начните печатать и вы сможете найти введённую когда-то команду гораздо проще, чем нажимая 300 раз «вверх».
Или используйте
history|grep "foo"
для поиска «foo&qyot; в истории команд.
cd -
переход в предыдущую директорию — полезно, если вы хотите куда-то сходить что-то поменять, а потом быстро вернуться обратно.
Предположим, что нужно выполнить несколько команд подряд с каким-то объектом:
touch file
ls file
echo 1 > file
rm file
Вместо того, чтобы каждый раз набирать file, достаточно нажать «Esc .», и аргумент из предыдущей команды подставится автоматически.
Главный совет.
Почитайте man shopt, найдёте много полезного :)
В заключение.
Вот несколько советов, как сделать историю bash более управляемой. Если у вас есть еще советы, добавляйте их в комментарии к оригинальной статье или сюда.
Слушайте, а HISTCONTROL=»ignoredups» кажется не работает. Очень нужная фича, обидно.
GNU bash, version 3.2.25(1)-release (i486-pc-linux-gnu)
Igron, сейчас еще раз проверил на bash 2.0.5 и 3.2.9, в обоих переменная окружения HISTCONTROL=»ignoredups» описана в man bash и работает. Так что вам нужно, во-первых, поискать описание этой переменной в man bash (не думаю, что она может отсутствовать в каком-то из промежуточных релизов) и, во-вторых, проверить правильность экспортирования и наличие этой опции в выводе env