Когда вы начнете больше пользоваться терминалом, вы будете постоянно выполнять различные команды.
И тогда вы окажетесь в ситуации, когда захотите узнать, какие команды вы выполняли ранее, или повторно запустить определенную команду.
Именно поэтому в Linux существует команда history
. Она встроена в оболочку и чрезвычайно полезна.
Поскольку это встроенная оболочка, она может вести себя немного по-разному в зависимости от используемой оболочки (bash, zsh, ksh и т.д.) и от того, как она была настроена. Тем не менее, в основе своей, основы остаются неизменными.
Проверка истории команд
Вы можете несколько раз нажать клавишу вверх, чтобы просмотреть историю команд. Но при этом отображается только одна команда за раз. Команда history позволяет просмотреть все ранее запущенные команды.
Откройте терминал и выполните следующую команду:
history
Он показывает команды, которые вы выполняли в прошлом. Для меня она показала следующее:

История обычно хранится в каталоге ~/.bash_history
. Где ~ означает домашний каталог, если вы не знали.
Если у вас возникнут сомнения, вы можете проверить переменную HISTFILE
, чтобы узнать расположение файла истории в вашей оболочке.
echo $HISTFILE
Сколько команд хранится в истории?
Это зависит от переменной HISTFILESIZE
. В Debian и Ubuntu она обычно установлена на 2000.
echo $HISTFILESIZE
Слишком много строк в истории загромождают экран? Вы можете выбрать отображение только последних N строк истории с помощью history N
Выполнение команд из истории
Вы заметили, что команда history показывает число перед вводом команды? Вы можете использовать это число для запуска команды из истории. Например, чтобы запустить N-ю запись в истории команд, используйте:
!N
Вот реальный пример, в котором я запускаю команду на 152-й записи в истории.

Получаем больше от последней запущенной команды
Это не совсем прямой пример команды history, но он связан с историей команд, и я хотел обсудить его.
Вы можете использовать !!
, чтобы получить информацию о последней выполненной команде. Это очень полезно в том случае, если вы забыли запустить команду с помощью sudo. Вместо того чтобы набирать всю команду заново, вы можете просто использовать:
sudo !!
Это покажет полный текст выполняемой команды. Вот пример:

Если вы допустили опечатку в предыдущей команде, вы можете исправить ее следующим образом:
^foo^bar
Это заменит первый foo
на bar
в последней команде run.
Вот практический пример:

Еще один совет, который больше похож на сочетание клавиш в терминале и может работать не везде, но все равно очень удобен. Чтобы использовать последний аргумент последней запущенной команды, используйте клавиши Alt + ..
Поиск в истории команд
Вы можете нажать клавишу вверх (и вниз), чтобы просмотреть историю команд, и нажать Enter, когда появится нужная команда. Это хорошо работает для последних нескольких команд, но не стоит нажимать клавишу вверх 100 раз, чтобы получить команду из истории.
Один из способов поиска в истории – отфильтровать ее с помощью команды grep.
Допустим, вы хотите найти команду tail
, которую выполнили ранее:
history | grep tail
Другой способ – использовать функцию обратного поиска. Нажмите Ctrl + R, и вы окажетесь в интерфейсе обратного поиска. Начните вводить поисковый запрос, и он начнет показывать совпадающие команды из истории.
Конечно, может быть несколько совпадений с одной и той же строкой поиска. Нажмите Ctrl + R несколько раз, чтобы просмотреть все совпадения. Одновременно отображается только одно совпадение.
Если вы нашли нужную команду, нажмите клавишу со стрелкой вправо, чтобы выйти из обратного поиска и начать использовать эту команду.
Нажмите Ctrl + C, чтобы выйти из обратного поиска, не получив ни одной команды для использования.
Удаление команды из истории
Чтобы удалить команду из истории, вы можете использовать ее номер записи следующим образом:
history -d N
В приведенном ниже примере я удаляю длинную команду flatpak add
, находящуюся под номером 181:

Вы также можете указать диапазон строк для удаления:
history -d 160-180
history -c
очистит всю историю bash.
Исключение некоторых команд из истории
Если вы не хотите, чтобы какая-либо команда записывалась в историю, просто поставьте перед ней пробел и выполните команду.
В примере ниже я запустил случайную команду, которая даже не существует, но я поставил перед ней пробел. Она, конечно, выдает ошибку, но в историю не записывается.

Заметили ли вы, что второй history 7
также не был записан в историю? Это из-за переменной окружения HISTCONTROL
. Она может иметь следующие значения:
ignorespace
: Выполните команду, поставив перед ней пробел, и она не будет включена в историю.ignoredups
: Если последовательно выполняются две или более одинаковых команды, записывается только первая.ignoreboth
: Использовать обе вышеупомянутые функции.
Вы также можете установить переменную HISTIGNORE в файле _bashrc) и исключить некоторые общие команды из истории. Используйте ее, как HISTIGNORE='pwd:echo *:clear'
Бонус: Почему некоторые команды не записываются в историю?
Вы когда-нибудь замечали, что не все команды, которые вы выполняете, записываются в историю? Вы работаете в нескольких терминальных сессиях? Это может быть причиной.
Дело вот в чем. Файл истории ~/.bash_history
не изменяется до тех пор, пока вы не закроете терминальную сессию.
Если вы проверите команду history
и содержимое ~/.bash_history, вы увидите, что команды, которые вы выполняли в текущем сеансе, отсутствуют.
Если вы когда-нибудь открывали несколько терминалов и вкладок, то могли заметить, что недавно выполненные команды на одной вкладке недоступны на другой при нажатии клавиши со стрелкой. Это происходит потому, что история команд для текущего сеанса еще не сохранена в файле ~/.bash_history
.
Теперь, когда вы начинаете закрывать терминальные сессии, записывается только история последней закрытой сессии. История команд из других сеансов теряется. Это поведение по умолчанию.
Вы можете изменить его, используя export PROMPT_COMMAND='history -a'
(режим добавления) в вашем файле bashrc. Он заключается в том, что перед появлением приглашения (знака $ на терминале) в файл истории добавляется только что выполненная команда.
Некоторые люди используют export PROMPT_COMMAND='history -a; history -r'
, который не только записывает историю каждого сеанса, но и собирает историю команд из других сеансов терминала, чтобы вы могли использовать их с помощью клавиш со стрелками вверх. Это может звучать хорошо, но быстро становится беспорядочным. Решайте сами, нужно ли вам это.
Заключение
Даже если я не использую команду history
в смысле ввода команды history, я постоянно использую обратный поиск и клавишу со стрелкой вверх для поиска истории. Но все же полезно знать о различных возможностях, которые предлагает механизм истории.
Комментарии (0)