История команд bash
История команд bash хранится в специальном файле .bash_history, который находится в домашнем каталоге пользователя. Чтобы её посмотреть, наберите cat .bash_history. Но есть более простой способ, используя команду 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:
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 ~ # echo !428
Как видно из последней команды, подстановка с восклицательным знаком может быть частью другой команды.
Номер может быть относительным, с конца: !-2. Специальное сокращение !! — последняя команда. Можно указать подстроку для поиска, например, !?encoder? — последняя команда включающая строку encoder. Без вопросительных знаков, например, !gzip — последняя команда начинающаяся с gzip.
Если требуется избежать сохранения команды в историю, необходимо поставить пробел перед командой.
Параметры введёной команды доступны через «:» (двоеточие):
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. По сути, необходимо лишь экспортировать эту переменную с нужным параметром:
Чтобы переменную окружения не писать каждый раз, после перезагрузки системы, ее необходимо записать в файл ~/.bachrc.
Очистка истории команд
Для очистки истории команд используйте параметр -c команды history:
Удаление команды из истории
Сочетание клавиш Ctrl + U удаляет написанную в текущей строке команду (очищает строку) и удаляет её из истории.
При этом курсор должен стоять в конце строки. Если курсор находится в середине строки, то будет удалено только то, что находится перед курсором.
Автодополнение или автозавершение
В bash достаточно написать первые символы команды, нажать TAB и интерпретатор сам допишет оставшуюся часть команды, если её можно однозначно определить.
Если команду однозначно определить нельзя, то двойное нажатие Tab выводит на экран все возможные варианты (полезно, если не помните полное название программы):
ls lsattr lsblk lscpu lsfd lsipc lsirq
Манипуляции с именами файлов
Модификатор :t даёт доступ к имени файла. Эта удобно в таком сценарии работы. Вы обращаетесь к файлу, указывая полный путь:
Потом переходите в каталог с этим файлом
Выполняете ещё какие-то команды, а потом решаете отредактировать файл. Тогда можно написать так:
То есть, вы находите в историю последнюю команду cat (!cat), берёте её последний аргумент :$, а от него оставляете только имя файла :t.
Модификатор :h работает противоположно, он отсекает имя файла, оставляя путь. Это полезно, например, когда вы хотите перейти в каталог с последним просмотренным файлом:
gentoo ~ # cd $vi:$:h
Последняя команда перейдёт в каталог /etc.
Последний модификатор из этой серии — :r. Он отсекает расширение. Его можно указывать несколько раз, есть нужно убрать несколько расширений (.tar.gz).