Как использовать команду history в Linux

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

Управление историей

В виде Джордж Сантаяна классно сказал, «Те, кто не может вспомнить прошлое, обречены его повторять». К сожалению, в Linux, если вы не можете вспомнить прошлое, вы не можете повторить его, даже если захотите.

Вот тогда и пригодится команда Linux history. Это позволяет вам просмотреть и повторить ваши предыдущие команды. Это не только для поощрения лени или экономии времени — здесь также играет роль фактор эффективности (и точности). Чем длиннее и сложнее команда, тем сложнее ее запомнить и ввести без ошибок. Есть два типа ошибок: один, который мешает команде работать, и второй, который позволяет команде работать, но заставляет ее делать что-то неожиданное.

Команда history устраняет эти проблемы. Как и большинство команд Linux, это больше, чем вы думаете. Однако, если вы научитесь использовать команду history, вы сможете улучшить использование командной строки Linux каждый день. Это хорошее вложение вашего времени. Есть гораздо лучшие способы использовать команду history, чем просто многократно нажимать стрелку вверх.

Команда истории

В простейшей форме вы можете использовать команду history, просто набрав ее имя:

history

В

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

Пример вывода из

Команды пронумерованы, а самые последние использованные (с наибольшими номерами) находятся в конце списка.

Чтобы увидеть определенное количество команд, вы можете передать номер в историю в командной строке. Например, чтобы увидеть последние 10 команд, которые вы использовали, введите следующее:

history 10

В

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

history | tail -n 10

В

Повторение команд

Если вы хотите повторно использовать команду из списка истории, введите восклицательный знак (!) И номер команды без пробелов между ними.

Например, чтобы повторить команду номер 37, вы должны ввести эту команду:

!37

An

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

!!

An

Это может быть полезно, когда вы вводите команду и забываете использовать sudo. Введите sudo, один пробел, двойные восклицательные знаки и нажмите Enter.

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

mv ./my_script.sh /usr/local/bin/
sudo !!

An

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

  Как приостановить сценарий Bash с помощью команды сна в Linux

Вы можете использовать один восклицательный знак, дефис (-) и номер любой предыдущей команды (опять же, без пробелов), чтобы повторить ее.

Чтобы повторить 13-ю предыдущую команду, вы должны ввести следующее:

!-13

An

Поиск команд по строке

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

Например, чтобы повторить последнюю команду, запущенную с помощью sudo, вы должны ввести эту команду:

!sudo

An

Однако в этом есть элемент опасности. Если последняя команда, запущенная с sudo, не та, которую вы думаете, вы запустите неверную команду.

Однако, чтобы обеспечить подстраховку, вы можете использовать модификатор: p (print), как показано ниже:

!sudo:p

An

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

Если вы хотите найти команду, содержащую определенную строку, вы можете использовать восклицательный и вопросительный знаки.

Например, чтобы найти и выполнить первую соответствующую команду, содержащую слово «псевдонимы», вы должны ввести эту команду:

!?aliases

An

Он найдет любую команду, содержащую строку «aliases», независимо от того, где она находится в строке.

Интерактивный поиск

Интерактивный поиск позволяет пролистывать список подходящих команд и повторять нужную.

Просто нажмите Ctrl + r, чтобы начать поиск.

Окно терминала после

Когда вы введете подсказку для поиска, появится первая соответствующая команда. Вводимые буквы появляются между обратным апострофом (`) и апострофом (‘). Соответствующие команды обновляются по мере ввода каждой буквы.

А

Каждый раз, когда вы нажимаете Ctrl + r, вы ищите в обратном направлении следующую соответствующую команду, которая появляется в окне терминала.

А

Когда вы нажмете Enter, отобразится команда.

В

Чтобы отредактировать команду перед ее выполнением, нажмите клавишу со стрелкой влево или вправо.

А

Команда появляется в командной строке, и вы можете ее редактировать.

Команда в командной строке с включенным редактированием.

Вы можете использовать другие инструменты Linux для поиска в списке истории. Например, чтобы передать вывод из истории в grep и поиск команд, содержащих строку «Псевдонимы» вы можете использовать эту команду:

history | grep aliases

В

Изменение последней команды

Если вам нужно исправить опечатку, а затем повторить команду, вы можете использовать курсор (^), чтобы изменить ее. Это отличный трюк, который пригодится вам всякий раз, когда вы неправильно пишете команду или хотите ее повторно запустить с другим параметром или параметром командной строки.

Чтобы использовать его, введите (без пробелов) курсор, текст, который вы хотите заменить, другой курсор, текст, которым вы хотите его заменить, другой курсор, а затем нажмите Enter.

Например, предположим, что вы набираете следующую команду, случайно набрав «shhd» вместо «sshd»:

sudo systemctl start shhd

Вы можете легко исправить это, набрав следующее:

^shhd^sshd^

А

Команда выполняется с изменением «shhd» на «sshd».

Удаление команд из списка истории

Вы также можете удалять команды из списка истории с помощью опции -d (удалить). Нет причин оставлять команду с ошибкой в ​​списке истории.

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

history | grep shhd
history -d 83
history | grep shhd

В

Вы также можете передать ряд команд параметру -d. Чтобы удалить все записи списка с 22 по 32 (включительно), введите эту команду:

history -d 22 32

Чтобы удалить только последние пять команд, вы можете ввести отрицательное число, например:

history -d -5

Обновление файла истории вручную

Когда вы входите в систему или открываете сеанс терминала, список истории считывается из файла истории. В Bash файл истории по умолчанию — .bash_history.

  Как слушать радио Pandora в Linux

Любые изменения, которые вы вносите в текущем сеансе окна терминала, записываются в файл истории только при закрытии окна терминала или выходе из системы.

Предположим, вы хотите открыть другое окно терминала, чтобы получить доступ к полному списку истории, включая команды, которые вы вводили в первом окне терминала. Параметр -a (all) позволяет сделать это в первом окне терминала перед тем, как открыть второе.

Чтобы использовать его, введите следующее:

history -a

В

Команды незаметно записываются в файл истории.

Если вы хотите записать все изменения в списке истории в файл истории (например, если вы удалили некоторые старые команды), вы можете использовать параметр -w (запись), например:

history -w

В

Очистка списка истории

Чтобы удалить все команды из списка истории, вы можете использовать параметр -c (очистить) следующим образом:

history -c

история -c в окне терминала

Если вы дополнительно хотите принудительно внести эти изменения в файл истории, используйте параметр -w, например:

history -w

Безопасность и файл истории

Если вы используете какие-либо приложения, которые требуют от вас ввода конфиденциальной информации (например, паролей) в командной строке, помните, что это также будет сохранено в файле истории. Если вы не хотите сохранять определенную информацию, вы можете использовать следующую структуру команд, чтобы немедленно удалить ее из списка истории:

special-app my-secret-password;history -d $(history 1)
history 5

А

Эта структура включает две команды, разделенные точкой с запятой (;). Давайте разберем это:

special-app: название программы, которую мы используем.
my-secret-password: секретный пароль, который нам нужно указать для приложения в командной строке. Это конец первой команды.
history -d: во второй команде мы вызываем параметр истории -d (удалить). То, что мы собираемся удалить, находится в следующей части команды.
$ (история 1): используется подстановка команд. Часть команды, содержащаяся в $ (), выполняется в подоболочке. Результат этого выполнения публикуется как текст в исходной команде. Команда history 1 возвращает предыдущую команду. Итак, вы можете думать о второй команде как о history -d «последняя команда здесь».

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

Однако есть еще более простой способ сделать это. Поскольку Bash по умолчанию игнорирует строки, начинающиеся с пробела, просто добавьте пробел в начало строки, как показано ниже:

 special-app another-password
history 5

А

Команда с паролем не добавляется в список истории. Причина, по которой этот трюк работает, содержится в файле .bashrc.

Файл .bashrc

Файл .bashrc запускается каждый раз, когда вы входите в систему или открываете окно терминала. Он также содержит некоторые значения, которые управляют поведением команды history. Давайте отредактируем этот файл с помощью gedit.

  Как установить SmartGit в Linux

Введите следующее:

gedit .bashrc

В

В верхней части файла вы видите две записи:

HISTSIZE: максимальное количество записей, которое может содержать список истории.
HISTFILESIZE: ограничение на количество строк, которое может содержать файл истории.

Эти два значения взаимодействуют следующим образом:

Когда вы входите в систему или запускаете сеанс окна терминала, список истории заполняется из файла .bash_history.
Когда вы закрываете окно терминала, максимальное количество команд, заданное в HISTSIZE, сохраняется в файле .bash_history.
Если опция оболочки histappend включена, команды добавляются в .bash_history. Если histappend не установлен, .bash_history перезаписывается.
После сохранения команд из списка истории в .bash_history файл истории усекается, чтобы содержать не более HISTFILESIZE строк.

Также в верхней части файла вы видите запись для значения HISTCONTROL.

В

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

ignorespaces: строки, начинающиеся с пробела, не добавляются в список истории.
ignoredups: повторяющиеся команды не добавляются в файл истории.
ignoreboth: включает оба вышеперечисленных.

Вы также можете указать конкретные команды, которые не хотите добавлять в свой список истории. Разделите их двоеточием (:) и заключите в кавычки («…»).

Вы должны следовать этой структуре, чтобы добавить строку в ваш файл .bashrc и заменить команды, которые вы хотите игнорировать:

export HISTIGNORE="ls:history"

An

Использование меток времени

Если вы хотите добавить отметки времени в список истории, вы можете использовать параметр HISTIMEFORMAT. Для этого вы просто добавляете в файл .bashrc такую ​​строку:

export HISTTIMEFORMAT="%c "

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

An

Теперь, когда вы запускаете команду history, вы видите дату и время. Обратите внимание, что все команды, которые были в списке истории до того, как вы добавили метки времени, будут отмечены датой и временем первой команды, получившей метку времени. В этом примере, показанном ниже, это была команда 118.

Список истории с отметками времени в окне терминала.

Это очень длинная метка времени. Однако вы можете использовать токены, отличные от% c, для его уточнения. Вы можете использовать и другие токены:

% d: День
% m: месяц
% y: Год
% H: час
% M: минуты
% S: секунды
% F: Полная дата (формат год-месяц-дата)
% T: Время (формат час: минуты: секунды)
% c: полная отметка даты и времени (форматы день-дата-месяц-год и час: минуты: секунды)

Давайте поэкспериментируем и воспользуемся несколькими разными токенами:

export HISTTIMEFORMAT="%d n%m %T "

Экспорт HISTTIMEFORMAT =

В выходных данных используются день, месяц и время.

Список истории с отметками времени в окне терминала.

Однако, если мы удалим день и месяц, он просто покажет время.

Любые изменения, которые вы вносите в HISTIMEFORMAT, применяются ко всему списку истории. Это возможно, потому что время для каждой команды сохраняется как количество секунд от эпохи Unix. Директива HISTTIMEFORMAT просто определяет формат, используемый для визуализации этого количества секунд в удобочитаемом стиле, например:

export HISTTIMEFORMAT="%T "

В

Наша продукция теперь более управляема.

Список истории с отметками времени в окне терминала.

Вы также можете использовать команду history для аудита. Иногда просмотр команд, которые вы использовали в прошлом, может помочь вам определить, что могло вызвать проблему.

Как и в жизни, в Linux вы можете использовать команду history, чтобы заново пережить хорошие времена и извлечь уроки из плохих.