История команд bash

История команд bash хранится в специальном файле .bash_history, который находится в домашнем каталоге пользователя. Чтобы её посмотреть, наберите cat .bash_history. Но есть более простой способ, используя команду history:

gentoo ~ # history
  …
  477  ls
  478  mc
  479  mc
  480  free -h
  481  rc-service nginx restart
  482  ./control.sh
  483  ./rebuild.sh
  484  tail .bash_history
  485  cat .bash_history
  486  cat .bash_history
  488  cd
  489  mc
  490  ls

Эта команда выведет содержимое файла .bash_history, добавив слева номер. Если добавить цифру, например, history 5, то отобразятся только 5 последних введенных команд.

Если же нужно найти определенные команды, можно задействовать утилиту grep:

gentoo ~ # history | grep gzip
  392  gzip -9 -k -f /var/www/test.com/js/jquery-init.js
  424  gzip -9 -k -f /var/www/test.com/css/styles.css
  428  gzip -9 -k -f /var/www/test.com/css/styles_small.css
  500  history | grep gzip

Для исполнения команды с заданным номером, поставьте этот номер после восклицательного знака:

gentoo ~ # !428
gentoo ~ # echo !428

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

Номер может быть относительным, с конца: !-2. Специальное сокращение !! — последняя команда. Можно указать подстроку для поиска, например, !?encoder? — последняя команда включающая строку encoder. Без вопросительных знаков, например, !gzip — последняя команда начинающаяся с gzip.

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

Параметры введёной команды доступны через «:» (двоеточие):

gentoo ~ # cd /var/www
gentoo ~ # echo !!:1
echo /var/www
/var/www

где, !! — ссылка на последнюю команду, :1 ссылка на её первый аргумент. В данном случае echo !!:1 преобразуется в echo /var/www.

Есть и более привычные сокращения: первый аргумент — ^, последний — $, все — *.

Поиск по истории

Перемещаться по истории команд можно клавишами со стрелками ↑ и ↓ (если не работает, используйте альтернативное сочетание Ctrl-p и Ctrl-n). Но если команда была введена давно, то для ускорения процесса можно включить режим поиска, нажав CTRL-r. В этом режиме, после ввода символов, сразу отображается ближайшая команда, в которой эти символы встречаются. Для поиска следующего совпадения надо повторно нажать Ctrl-r.

Есть ещё очень удобный способ поиска — по первым символам команды. Наберите начало команды и клавишами PageUp и PageDown ищите в истории команду с таким же началом.

Если этот способ недоступен, допишите в файле /etc/inputrc следующие строки:

# PageUp, PageDown
"\e[5~": history-search-backward
"\e[6~": history-search-forward

Игнорирование дублей команд

Чтобы вывести историю ⁠команд с игнорированием дублей нужно использовать значение erasedups переменной окружения HISTCONTROL. По сути, необходимо лишь экспортировать эту переменную с нужным параметром:

gentoo ~ # export HISTCONTROL=ignoreboth:erasedups

Чтобы переменную окружения не писать каждый раз, после перезагрузки системы, ее необходимо записать в файл ~/.bachrc.

Очистка истории команд

Для очистки истории команд используйте параметр -c команды history:

gentoo ~ # history -c

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

Сочетание клавиш Ctrl + U удаляет написанную в текущей строке команду (очищает строку) и удаляет её из истории.

При этом курсор должен стоять в конце строки. Если курсор находится в середине строки, то будет удалено только то, что находится перед курсором.

Автодополнение или автозавершение

В bash достаточно написать первые символы команды, нажать TAB и интерпретатор сам допишет оставшуюся часть команды, если её можно однозначно определить.

Если команду однозначно определить нельзя, то двойное нажатие Tab выводит на экран все возможные варианты (полезно, если не помните полное название программы):

gentoo ~ # ls
ls   lsattr   lsblk   lscpu   lsfd   lsipc   lsirq

Манипуляции с именами файлов

Модификатор :t даёт доступ к имени файла. Эта удобно в таком сценарии работы. Вы обращаетесь к файлу, указывая полный путь:

gentoo ~ # cat /etc/hosts

Потом переходите в каталог с этим файлом

gentoo ~ # cd /etc

Выполняете ещё какие-то команды, а потом решаете отредактировать файл. Тогда можно написать так:

gentoo ~ # vi !cat:$:t

То есть, вы находите в историю последнюю команду cat (!cat), берёте её последний аргумент :$, а от него оставляете только имя файла :t.

Модификатор :h работает противоположно, он отсекает имя файла, оставляя путь. Это полезно, например, когда вы хотите перейти в каталог с последним просмотренным файлом:

gentoo ~ # vi /etc/hosts
gentoo ~ # cd $vi:$:h

Последняя команда перейдёт в каталог /etc.

Последний модификатор из этой серии — :r. Он отсекает расширение. Его можно указывать несколько раз, есть нужно убрать несколько расширений (.tar.gz).