Bash, история команд

История Bash – это текущая запись всех команд, которые вы вводите в оболочку Bash. По мере ввода команд они сохраняются в оперативной памяти и записываются в файл .bash_history после закрытия сеанса оболочки.

Поскольку все команды хранятся таким образом, вы можете манипулировать ими и использовать их для повышения производительности командной строки. В этом статье мы рассмотрим некоторые основы работы с историей Bash.

Переменные Bash History

Есть несколько переменных среды, которые управляют конфигурацией истории bash.

HISTFILE – Содержит расположение файла .bash_history.
HISTFILESIZE – содержит максимальное количество строк, которые будут записаны в файл истории bash.
HISTSIZE – содержит количество событий, которые будут храниться в оперативной памяти.
HISTCONTROL – содержит правила для того, что должно быть записано в историю, а что следует игнорировать.

Настройки HISTCONTROL

Переменная HISTCONTROL имеет четыре параметра, которыми вы можете манипулировать, чтобы изменить свое поведение.

Ignoredups – Не писать строку после команды дублирования строки.
Ignorespace – не писать строки, начинающиеся с одного или нескольких пробелов в истории.
Ignoreboth – Установить оба значения выше.
Undefined – Если вы не определяете какие-либо правила, они не будут применены.

Проверьте текущие настройки истории с помощью команды экспорта:

user@srv01:~$ export | grep -i hist
 declare -x HISTCONTROL="ignoredups"
 declare -x HISTSIZE="1000"

Измените настройки, экспортировав нужную переменную:

user@srv01:~$ export HISTCONTROL="Ignoreboth"
user@srv01:~$ export | grep -i hist
 declare -x HISTCONTROL="Ignoreboth"
 declare -x HISTSIZE="1000"

Сделайте ваши настройки постоянными, добавив их в файл bashrc:

user@srv01:~$ echo "export HISTCONTROL=Ignoredups" >> ~/.bashrc
user@srv01:~$ echo "export HISTSIZE=2000" >> ~/.bashrc

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

user@srv01:~$ source ~/.bashrc 
user@srv01:~$ echo $HISTSIZE
 2000

Показать историю команд

Чтобы отобразить список ранее введенных команд в вашей системе Linux, вы будете использовать команду history. Просто введите в командной строке:

user@srv01:~$ history
1  cd /var/log
2  tail -10 /var/log/messages
3  history

Команда history выводит все команды из вашей истории, начиная с первой и заканчивая последней. Значение по умолчанию обычно составляет 1000, но это можно контролировать, изменяя переменную среды $HISTFILESIZE.

Показать последнее X количество команд

Вы можете посмотреть последнее число набранных команд, просто добавив число к команде. Например, если вы хотите увидеть последние 20 команд:

$ history 20
7  vi names
8  for i in `cat names`; do dig +short $i; done
9  vi names
10  for i in `cat names`; do dig +short $i; done
11  for i in `cat names`; do dig +short $i >> ptr; done
12  cat ptr
13  for i in `cat names`; do echo -n "FORWARD: $i - REVERSE: "; dig +short $i; done
14  cd ~
15  cd scripts/
16  ls -lrt
17  vi update-clam.sh
18  freshclam
19  history -d 19
20  cd /var/tmp
21  ls -lrt
22  unzip android-studio-ide-135.1740770-linux.zip
23  cd android-studio/
24  cd bin/
25  ./studio.sh
26  history 20

Вызов команд из истории

Если вы хотите повторить самую последнюю команду, вы можете просто напечатать !! в командной строке bash запустит самую последнюю введенную вами команду. Я не считаю эту команду столь же полезной, как другие, потому что вы можете просто нажать стрелку вверх для того же эффекта. Например, допустим, вы хотели запустить команду, которую выполнили шесть команд назад. Для этого вы можете запустить следующую команду:

!-6

В моем случае это снова запустил ls -lrt, как вы можете видеть из вывода моей истории, это было на шесть команд выше моей последней команды.

Вы также можете использовать “!” как своего рода поиск. Используя мой пример истории bash, скажем, я хотел запустить последний цикл for, который был запущен. Вы можете использовать “! -14”, но трудно вспомнить, сколько команд было назад, по крайней мере, для меня. Вместо этого мы можем сказать bash просто выполнить последнюю команду, начинающуюся с “for”, вот так:

!for

Пример:

user@srv01:~$ !for
for i in `cat names`; do echo -n "FORWARD: $i - REVERSE: "; dig +short $i; done

Вы также можете указать по номеру, какую команду вы хотите запустить. Например, я хотел запустить команду 18 в приведенном выше примере. Используя восклицательный знак, сделать это можно так:

!18

Например:

user@srv01:~$ !18
freshclam

Использование указателей слов

Есть и более сложные “указатели слов”. Они позволяют вам взять слово или слова из предыдущей команды и использовать их снова, не печатая их.

Допустим, мы хотели увидеть размер файла, а потом решили, что хотим посмотреть его содержимое. Мы можем использовать обозначение слова “!!: $”, чтобы извлечь последнее слово из последней команды и заменить его командой cat следующим образом.

user@srv01:~$ ls -lrt /etc/redhat-release
lrwxrwxrwx. 1 root root 14 May 22 16:39 /etc/redhat-release -> fedora-release
user@srv01:~$ cat !!:$
cat /etc/redhat-release
Fedora release 17 (Beefy Miracle)

Обозначение “!!: $” можно сократить до “! $”. Важно знать, что слова разделены пробелами, причем первое слово начинается с 0.

Например, следующая команда:

dig +short ya.ru

dig – это слово 0, + short – это слово 1, а ya.ru – это слово 2.

Теперь давайте посмотрим, как извлечь первое слово (или 0) из команды. Мы будем использовать тот же пример выше, но на этот раз мы хотели бы перечислить весь каталог вместо просмотра содержимого файла.

user@srv01:~$ ls -lrt /etc/redhat-release
lrwxrwxrwx. 1 root root 14 May 22 16:39 /etc/redhat-release -> fedora-release
user@srv01:~$ !!:0
ls
Backups   Music     Public      scripts         Documents 
SSLThing      Desktop  Downloads   Pictures  Videos

Вы также можете извлечь слово из команды, используя синтаксис поиска. Например, допустим, вы хотели использовать второе слово (1) из последней команды cat, которую вы выполнили. Не имеет значения, была ли это последняя команда, которую вы выполнили, или 30 команд назад, вы можете использовать обозначение “! <String>: 1”. Вот пример:

user@srv01:~$ dig +short ya.ru
 87.250.250.242
user@srv01:~$ uname -r
 4.20.8-200.fc29.x86_64
user@srv01:~$ cat /etc/redhat-release 
 Fedora release 29 (Twenty Nine)
user@srv01:~$ host !dig:2
 host ya.ru
 ya.ru has address 87.250.250.242
 ya.ru has IPv6 address 2a02:6b8::2:242
 ya.ru mail is handled by 10 mx.yandex.ru.

Как вы можете видеть выше, “! Dig: 2” выполнил обратный поиск самой последней команды, начинающейся с “dig”, затем взял второе слово и вставил его в команду.

Поиск Bash History

Вы также можете искать по истории Bash. В командной строке bash, удерживая нажатой клавишу Ctrl, нажмите “r” и начните вводить первые несколько букв команды, которую вы ищете. Например, допустим, что я искал цикл “while”, который недавно набрал, для этого нажать [Ctrl + r] и набрать “wh”, вот так:

user@srv01:~$
(reverse-i-search)`wh': while read line; do echo $line | cut -f"s*" -d 2; done < forward

Этот поиск найдет последнюю команду, начинающуюся с “wh”, для поиска выше или глубже в истории просто снова нажмите [Ctrl + r].

Вы также можете найти строку в команде, введя восклицательный знак и заключив строку в вопросительные знаки, например:

$ !?FORWARD?

Пример:

user@srv01:~$ !?FORWARD?
for i in `cat names`; do echo -n "FORWARD: $i - REVERSE: "; dig +short $i; done

Вы также можете использовать другие инструменты, такие как more, less или grep.

history | more
history | less
history | grep ssh

Удаление истории Bash

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

Ваша история bash – это просто текстовый файл, сохраненный в ~ / .bash_history. Вы можете просто удалить этот файл, чтобы очистить историю bash, или вы можете более аккуратно выполнить команду history с опцией clear, например, так:

history -c

Вы также можете удалить определенную строку из своей истории Bash, используя опцию удаления, например, так:

history -d 12

Заключение

С историей Bash вы можете многое сделать, мы лишь рассказали об основах, с которых можно начать.

Если вам понравился этот пост, пожалуйста, поделитесь им.

Оставьте комментарий