Команда history

Команда history является встроенной командой командных оболочек C shell, csh и bash (но не sh), предназначенной для повторного исполнения ранее исполненных команд. Обычно история команд хранится в отдельном файле, например, командная оболочка bash хранит ее в файле .bash_history, расположенном в домашней директории пользователя. Это очень полезная команда, позволяющая сэкономить время, требующееся для повторного ввода длинных команд.

Базовый синтаксис команды выглядит следующим образом:

$ history [параметры]

Команда поддерживает различные параметры, позволяющие модифицировать файл, а также историю команд текущей сессии, которые, впрочем, используются крайне редко. В частности, параметр -c позволяет очистить историю команд, параметр -d позволяет удалить команду с заданным идентификатором из истории, параметр -a позволяет добавить команды из текущей сессии в файл истории команд с заданным именем, параметр -n позволяет прочитать новые команды из файла истории команд с заданным именем и добавить их в историю команд текущей сессии, параметр -r позволяет прочитать все команды из файла истории команд с заданным именем и добавить их в историю команд текущей сессии, параметр -w позволяет записать всю историю команд в файл с заданным именем, параметр -p позволяет раскрыть аргументы и вывести результаты без добавления в историю и параметр -s позволяет добавить аргументы в качестве единственной команды истории текущей сессии.

Команда учитывает значения переменных окружения. Например, переменные окружения FILENAME и HISTFILE позволяют задать имя файла истории команд, переменная окружения HISTTIMEFORMAT — установить формат вывода даты и времени, переменные окружения HISTSIZE и HISTFILESIZE — установить максимальное количество строк файла истории команд, переменная окружения HISTCONTROL — задать правила обработки команд перед помещением их в историю текущей сессии.

Примеры использования

Работа с историей команд

Для вывода истории команд, выполненных с помощью командной оболочки, следует использовать команду history без каких-либо параметров:

$ history
1 mc
2 nano /etc/apt/sources.list
3 apt-get update

Команда выведет длинный список команд с их номерами. Для исполнения команды с заданным номером достаточно записать этот номер после восклицательного знака. Например, следующая команда позволит выполнить команду mc:

$ !1

Если использовать два восклицательных знака, будет повторена предыдущая команда:

$ !!

Если же нужно найти определенные команды, достаточно задействовать утилиту grep:

$ history | grep kwboot
196 apt search kwboot
200 kwboot
203 kwboot -t -B 115200 /dev/ttyUSB0 -b u-boot.kwb -p

Также в bash существует сочетание клавиш CTRL+R, позволяющее искать команды в истории команд в интерактивном режиме:

(reverse-i-search)`kwboot -t': kwboot -t -B 115200 /dev/ttyUSB3 -b u-boot.kwb -p

Блокировка механизма записи команд

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

$ export HISTSIZE=0
$ history
$

Очевидно, что после этого команда history не выводит никаких результатов.

Блокировка записи отдельных команд

Если вы хотите использовать историю команд командной оболочки, но не желаете, чтобы в нее записывались все исполняемые команды, вы можете воспользоваться переменной окружения HISTCONTROL. К примеру, вы можете экспортировать эту переменную с значением ignorespace, после чего все команды, начинающиеся с символа пробела, не будут записываться в историю команд:

$ export HISTCONTROL=ignorespace
$ history
1 mc

344 export HISTCONTROL=ignorespace
345 history
$  ls
$ history
1 mc

344 export HISTCONTROL=ignorespace
345 history
346 history

Очевидно, что команда ls с начальным символом пробела не была записана в историю.

Игнорирование дублей команд

Для того, чтобы вывести историю команд с игнорированием дублей достаточно использовать значение erasedups переменной окружения HISTCONTROL:

$ export HISTCONTROL=ignoreboth:erasedups
$ history
1 mc

344 export HISTCONTROL=ignoreboth:erasedups
345 history

Очистка истории команд

Для очистки истории команд достаточно использовать параметр -c команды history:

$ history -c