История 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 вы можете многое сделать, мы лишь рассказали об основах, с которых можно начать.
Если вам понравился этот пост, пожалуйста, поделитесь им.