Поиск по сайту:

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


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

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

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

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

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

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

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

history

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

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

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

history 10

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

history | tail -n 10

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

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

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

!37

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

!!

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

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

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

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

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

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

!-13

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

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

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

!sudo

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

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

!sudo:p

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

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

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

!?aliases

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

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

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

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

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

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

Когда вы нажмете Enter, отображаемая команда будет выполнена.

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

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

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

history | grep aliases

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

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

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

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

sudo systemctl start shhd

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

^shhd^sshd^

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

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

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

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

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

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

history -d 22 32

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

history -d -5

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

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

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

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

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

history -a

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

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

history -w

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

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

history -c

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

history -w

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

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

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

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

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

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

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

 special-app another-password
history 5

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

Файл .bashrc

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

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

gedit .bashrc

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

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

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

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

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

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

  • игнорировать пробелы.Строки, начинающиеся с пробела, не добавляются в список истории.
  • игнорированные дубликаты:повторяющиеся команды не добавляются в файл истории.
  • игнорировать оба:включает оба вышеперечисленных.

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

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

export HISTIGNORE="ls:history"

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

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

export HISTTIMEFORMAT="%c "

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

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

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

  • %d: день
  • %m: месяц
  • %y: год
  • %H: Час
  • %M: минуты
  • %S: секунды
  • %F: Полная дата (в формате год-месяц-дата)
  • %T: время (в формате часы:минуты:секунды)
  • %c: Полная отметка даты и времени (в формате день-число-месяц-год и часы:минуты:секунды)< /li>

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

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

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

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

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

export HISTTIMEFORMAT="%T "

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

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

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

RELATED: Best Linux Laptops for Developers and Enthusiasts