Настройка и работа в Linux
adb5321d

Работаем с историей команд Часть II Усовершенствования


Разбираясь с функционированием перечня ранее введенных команд, я обнаружил что перечень обладает несколькими отрицательными свойствами. Так при вводе одной и той же команды, она каждый раз оседает в истории. Пример:

$ echo 1 1 $ echo 1 1 $ echo 1 1 $ history 5 26 PS1='$ ' 27 echo 1 28 echo 1 29 echo 1 30 history 5

Как видно команда echo 1 была три раза введена и три раза была записана в историю. Для чего не понятно. Это можно устранить вставив строку HISTCONTROL=ignoredups в ваш файл ~/.bash_profile. Вышеприведенный пример будет выглядеть следующим образом:

$ HISTCONTROL=ignoredups $ echo 1 1 $ echo 1 1 $ echo 1 1 $ echo 1 1 $ history 4 42 history 4 43 HISTCONTROL=ignoredups 44 echo 1 45 history 4

Как видно теперь повторяющаяся четыре раза команда echo 1, в перечне встречается только один раз. Но вот от следующей неприятности вышеприведенная опция не спасет:

$ echo 1 1 $ echo 2 2 $ echo 1 1 $ history 5 51 history 6 52 echo 1 53 echo 2 54 echo 1 55 history 5

Здесь команда echo 1, включена опять-таки два раза, что на мой взгляд, весьма неприятно.

Еще один неприятный момент, это то, что история засоряется короткими командами, смысла хранить которые нет. К таким командам можно отнести ls, ps, who, короче, те команды, длинна которых меньше 3-5 символов. У меня таких команд большинство. И что самое обидное, это то что из-за несколько сотен таких коротких команд, а также повторного включения одной и той же команды в перечень, перечень переполняется и из него выбрасываются действительно нужные команды.

Чтобы это исправить, пришлось написать парочку небольших функций облегчающих работу с историей. Скрипт реализующий их можно найти на странице Программы.

Если вкратце, то там реализованы такие функции для работы с историей:

  • hs - записывает историю в $HISTFILE, кроме того выбрасывает все повторяющиеся команды, а также команды длинна которых меньше $MINHISTITEMSIZE, таким образом перечень команд избавляется от мусора. Данная команда выполняется автоматически при выходе из интерпретатора;
  • hr [n] - название от History Reverse. Печатает n - строк истории, причем кроме прямой нумерации печатает обратную, что облегчает обращение к командам с помощью !-n, если n=0, то выводит весь перечень, если n опущено, то печатает только $DEFAULTPRINTSIZE строк истории;
  • hg [string [n]] - название от History Grep. Синоним hg n | egrep -i string, напечатать n - последних элементов истории, в которых встречается строка string, причем в строке могут применяться расширенные регулярные выражения, и она не чувствительна к регистру. Если n опущено, то поиск ведется по всему перечню.
Чтоб было более понятно о чем идет речь приведу пример:


$ hr 10 348 echo $HISTFILESIZE 9 349 vim lib/advhist.sh 8 350 ls 7 351 PS!='$ ' 6 352 PS1='$ ' 5 353 hr 4 354 ps 3 355 PS1='$ ' 2 356 who 1 357 hr $ hr 5 5 354 ps 4 355 ws 3 356 who 2 357 hr 1 358 hr 5 $ hs # Выкидывает из перечня короткие и повторяющиеся команды $ hr # Проверяем результаты 10 716 lynx sit/linux 9 717 getpg 8 718 lynx www.sit.kiev.ua/linux 7 719 echo $HISTFILE 6 720 echo $HISTSIZE 5 721 echo $HISTFILESIZE 4 722 vim lib/advhist.sh 3 723 PS!='$ ' 2 724 PS1='$ ' 1 725 hr $ hg ping # Находим все команды в которых присутствует подстрока ping 116 613 ping www.yandex 53 676 ping www.yandex.ru 1 728 hg ping $ !-53 # Выполняем найденный ping ping www.yandex.ru PING yandex.ru (62.118.249.254) from 195.230.153.157 : 56(84) bytes of data. 64 bytes from yandex.ru (62.118.249.254): icmp_seq=0 ttl=235 time=609.5 ms 64 bytes from yandex.ru (62.118.249.254): icmp_seq=1 ttl=235 time=600.0 ms .....

Замечу, что сохранение отфильтрованного перечня команд выполняется автоматически, при выходе из интерпретатора, или при обрыве связи при работе на удаленной машине.

Для использования этих функций, advhist.sh должен находится в ~/lib/advhist.sh, а в ваш .bashrc, необходимо добавить следующие строки:

if [ "$PS1" -a -f ~/lib/advhist.sh ]; then . ~/lib/advhist.sh fi

Для настройки можно изменить следующие переменные окружения:


  • DEFAULTPRINTSIZE - количество печатаемых строк командой hg, по умолчанию равно 10;
  • MINHISTITEMSIZE - строки перечня короче этой величины будут исключены из него при выполнении команды hs, по умолчанию удаляются строки короче 5-ти символов.



Содержание раздела