[ Content | View menu ]

Работа с историей команд в 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 более управляемой. Если у вас есть еще советы, добавляйте их в комментарии к оригинальной статье или сюда.

«
»

2 комментария

Write a comment - TrackBack - RSS Comments

  1. Comment by Igron:

    Слушайте, а HISTCONTROL=»ignoredups» кажется не работает. Очень нужная фича, обидно.
    GNU bash, version 3.2.25(1)-release (i486-pc-linux-gnu)

    31.01.2008 @ 00:50
  2. Comment by bappoy:

    Igron, сейчас еще раз проверил на bash 2.0.5 и 3.2.9, в обоих переменная окружения HISTCONTROL=»ignoredups» описана в man bash и работает. Так что вам нужно, во-первых, поискать описание этой переменной в man bash (не думаю, что она может отсутствовать в каком-то из промежуточных релизов) и, во-вторых, проверить правильность экспортирования и наличие этой опции в выводе env

    31.01.2008 @ 15:42
Write comment

Я не робот.