Гид по технологиям

Работа с историей команд Bash: горячие клавиши, расширение и очистка

9 min read Linux Обновлено 28 Dec 2025
История Bash: горячие клавиши, расширение и очистка
История Bash: горячие клавиши, расширение и очистка

Быстрые ссылки

  • Keyboard Shortcuts
  • View Your Bash History
  • Run Commands From Your History
  • Reuse Arguments From Your History
  • Rerun the Previous Command and Modify It
  • Where Your History Is Stored, and How to Clear It
  • How to Ignore Spaces and Duplicates

Bash — стандартная оболочка в большинстве дистрибутивов Linux, доступная в macOS и устанавливаемая в Windows 10/11. Она запоминает введённые команды и сохраняет их в файле истории. Вы, возможно, знаете базовые приёмы работы с историей, но у неё гораздо больше полезных возможностей.

Короткие определения

  • История команд: список команд, которые вы вводили в интерактивной сессии bash; хранится в файле (обычно ~/.bash_history).
  • Расширение истории: синтаксис с восклицательным знаком (!), который подставляет или выполняет команды из истории.
  • Переменные: HISTSIZE, HISTFILE, HISTCONTROL — управляют размером, местом и фильтрацией истории.

Горячие клавиши

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

  • Up Arrow или Ctrl+P: перейти к предыдущей команде.
  • Down Arrow или Ctrl+N: перейти к следующей.
  • Alt+R: отменить изменения, внесённые в команду из истории на текущей строке.

Bash поддерживает режим поиска по истории.

  • Ctrl+R: интерактивный поиск обратно по истории; начните ввод — bash найдёт соответствие.
  • Ctrl+O: выполнить найденную команду из режима поиска.
  • Ctrl+G: выйти из режима поиска истории без выполнения.

Просмотр истории

Чтобы вывести всю историю на экран, выполните:

history

Вы увидите пронумерованный список команд. Номер слева показывает позицию команды в истории (1 — самая старая, максимальный номер — самая новая).

Скриншот вывода команды history с номерами команд и примерами

Вы можете фильтровать вывод через grep:

history | grep ваш_запрос

Или посмотреть только последние строки через tail:

history | tail -5

Пример фильтрации истории с помощью grep

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

Bash умеет быстро подставлять или выполнять предыдущие команды с помощью механизма history expansion (расширение истории), использующего восклицательный знак — «bang».

  • По номеру: !#

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

!12
  • Повтор последней команды:
!!

!! эквивалентно !-1. Команда !-2 выполнит предпоследнюю команду.

Пример использования ! и !! для повтора команд из истории

Расширения работают в любой части строки. Можно добавить префиксы, суффиксы или передать результат в другую команду. Например, если забыли sudo, выполните:

sudo !!

Или перенаправьте вывод предыдущей команды в grep:

!! | grep текст

Использование sudo !! для повышения привилегий при повторном запуске команды

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

!pi

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

!12:p

!!:p

!text:p

Печать команд без выполнения для проверки перед запуском

Повторное использование аргументов из истории

Иногда удобно подставить аргументы из предыдущих команд в новую команду.

  • Последний аргумент предыдущей команды: !$

Пример: вы выполнили

touch /home/chris/some_long_file_name_you_dont_want_to_type_again

Затем хотите открыть файл в nano:

nano !$

Bash подставит последний аргумент.

  • Первый аргумент предыдущей команды: !^

Если вы выполнили ping google.com -c 4 и сделали ping !^, bash подставит google.com.

  • Все аргументы предыдущей команды: !*

Если вы выполнили ping google.com -c 4 и сделали ping !*, bash подставит google.com -c 4.

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

command !abc:2

command !abc:*

Пример: если в истории есть sudo hostname ubuntu, то echo !su:2 подставит ubuntu.

Примеры подстановки аргументов через !$, !^ и !*

Повтор с изменением

Быстро исправить опечатку в предыдущей команде можно так:

^abc^xyz

Например, если вы ввели ping gogle.com, выполните:

^gog^goog

и bash запустит ping google.com.

Исправление опечатки в последней команде с помощью ^old^new

Где хранится история и как её очистить

По умолчанию bash хранит историю команд в файле ~/.bash_history (например, /home/bob/.bash_history). История сохраняется между сессиями, поэтому команды останутся доступными после выхода и повторного входа.

Чтобы очистить историю текущей сессии:

history -c

Переменная HISTSIZE определяет, сколько записей shell будет хранить в памяти для текущей сессии. Обычно значение по умолчанию — 500 или 1000 записей. Посмотреть текущее значение:

echo $HISTSIZE

Чтобы временно установить размер истории в ноль:

HISTSIZE=0

После установки HISTSIZE=0 в текущей сессии bash не будет сохранять новые записи истории.

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

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

HISTCONTROL=ignorespace

Если перед командой поставить пробел, она выполнится, но не попадёт в историю (при включённой опции).

Чтобы игнорировать повторяющиеся записи, включите ignoredups:

HISTCONTROL=ignoredups

Можно комбинировать обе опции:

HISTCONTROL=ignoreboth

Помните, что переменные, заданные таким образом в терминале, действуют только в текущей сессии. Чтобы сохранить настройки, добавьте их в файл ~/.bashrc.

Настройка HISTCONTROL для игнорирования пробелов и дубликатов

Полезные настройки и сниппеты для .bashrc

Добавьте эти строки в ~/.bashrc, чтобы улучшить поведение истории во всех сессиях. Пояснения — рядом.

# Файл истории (по умолчанию ~/.bash_history)
HISTFILE=~/.bash_history

# Сколько записей хранить в памяти (используется для текущей сессии)
HISTSIZE=2000

# Сколько записей хранить в файле истории на диске
HISTFILESIZE=5000

# Не сохранять команды, начинающиеся с пробела, и дубликаты
HISTCONTROL=ignoreboth

# Добавлять записи истории в файл (не перезаписывать при выходе)
shopt -s histappend

# Сохранять записанную историю после каждой команды
PROMPT_COMMAND='history -a; history -n'

Пояснения:

  • histappend: добавляет новые записи к файлу истории, вместо перезаписи при выходе.
  • PROMPT_COMMAND с history -a и history -n гарантирует, что история из других открытых терминалов будет подхватываться, а ваши команды сохраняются немедленно.

Что делать, если история не содержит нужной команды

  • Команда выполнялась в другой оболочке или на другом хосте — проверьте правильный файл истории.
  • История могла быть очищена или переменная HISTSIZE была мала.
  • Выполнялось скриптом или через non-interactive shell — такие команды обычно не попадают в интерактивную историю.

Когда расширение истории может навредить

  • Выполнение !text может нечаянно выполнить нежелательную команду, если вы ошиблись в тексте. Всегда используйте :p для проверки перед выполнением.
  • Автоматическое выполнение из истории с правами root (например, sudo !!) может привести к опасным действиям, если забыли проверить аргументы.
  • История может хранить секреты (пароли, токены), если вы вводили их напрямую в командной строке.

Безопасность и конфиденциальность

  • Никогда не вводите пароли или секреты в виде аргументов команд. Используйте менеджеры секретов или вводите через защищённые запросы.
  • При необходимости удаления чувствительной строки выполните history -d N (где N — номер записи) и затем history -w чтобы записать изменения в файл.

Пример удаления записи с номером 123:

history -d 123
history -w

Если нужно полностью стереть историю и файл:

history -c
> ~/.bash_history

Обратите внимание: если у вас настроено отправление истории в централизованное хранилище или логирование, очистка локального файла может не удалить запись из удалённого лога.

Альтернативные инструменты и расширения

Если работа с историей bash кажется ограниченной, рассмотрите альтернативы или дополнения:

  • zsh + oh-my-zsh: улучшенная история и расширенные плагины.
  • fzf: интерактивный fuzzy-поиск по истории; часто интегрируется с Ctrl+R.
  • hstr (hh): удобный интерфейс для просмотра и выбора из истории.
  • ripgrep (rg) и ag: быстрый поиск по файлам истории.

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

Мини-методология: как настроить удобную историю за 5 шагов

  1. Откройте ~/.bashrc в редакторе.
  2. Установите HISTSIZE и HISTFILESIZE на разумные значения (например, 2000 и 5000).
  3. Включите shopt -s histappend.
  4. Установите PROMPT_COMMAND=’history -a; history -n’ для немедленного сохранения и подхвата истории.
  5. Добавьте HISTCONTROL=ignoreboth для чистоты истории.

Проверка: откройте два терминала, выполните команды в первом, убедитесь, что они видны во втором.

Ролевые чек-листы

Для разработчика:

  • Настроить HISTSIZE >= 2000.
  • Включить histappend и PROMPT_COMMAND.
  • Не хранить секреты в командах.
  • Использовать fzf для быстрого поиска.

Для SRE/администратора:

  • Настроить централизованную политику логирования истории, если требуется аудит.
  • Обучать команду избегать ввода секретов в командной строке.
  • Настроить ротацию и защиту файлов истории.

Для новичка:

  • Учите Ctrl+R и ↑/↓ для ускорения работы.
  • Используйте :p чтобы не выполнять незнакомые команды.
  • Читайте вывод history и очищайте старые записи при необходимости.

Инцидент: быстро очистить историю и предотвратить утечку

  1. Немедленно выполните history -c в интерактивной сессии.
  2. Выполните > ~/.bash_history чтобы очистить файл истории.
  3. Если история реплицируется или централизованно собирается — запросите удаление у владельца логов.
  4. Измените скомпрометированные учётные данные и пересмотрите практики ввода секретов.

Критерии приёмки

  • Все интерактивные терминальные сессии сохраняют историю (HISTSIZE > 0).
  • PROMPT_COMMAND настроен для немедленного сохранения истории между сессиями.
  • Дубликаты и команты, начинающиеся с пробела, фильтруются, если это требуется в политике.
  • Члены команды проинструктированы об опасностях ввода секретов в командной строке.

Полезные приёмы и эвристики

  • Всегда проверяйте команду через :p, если используете !text и не уверены.
  • Используйте history | grep или fzf для поиска по фрагментам команд.
  • Для одноразовых команд ставьте пробел перед вводом, если включён ignorespace.
  • Настройте PROMPT_COMMAND для коллективной работы в нескольких терминалах.

Когда история не поможет

  • Если команда запускалась автоматизированно (cron, systemd unit), её не будет в интерактивной истории.
  • Скрипты, запущенные non-interactively, не всегда пишут в ~/.bash_history.
  • Если вы использовали HISTSIZE=0 или вручную удалили файл, ждать старых записей не стоит.

Факт-бокс: ключевые параметры

  • Файл истории: ~/.bash_history
  • Переменная: HISTSIZE — записи в памяти (обычно 500 или 1000 по умолчанию)
  • Переменная: HISTFILESIZE — максимальный размер файла истории
  • Опция: HISTCONTROL=ignoreboth — игнорирует пробелы и дубликаты
  • Опция: shopt -s histappend — добавляет запись в файл, не перезаписывая его

Сравнение быстрых команд (шпаргалка)

  • history — показать историю
  • !N — выполнить N-ю команду из history
  • !! — повторить последнюю команду
  • !text — выполнить последнюю команду, начинавшуюся с text
  • !$ — последний аргумент предыдущей команды
  • !^ — первый аргумент предыдущей команды
  • !* — все аргументы предыдущей команды
  • ^old^new — заменить и выполнить предыдущую команду
  • history -c — очистить историю текущей сессии

Таблица часто используемых утилит Linux

| | Linux Commands | | Files | tar · pv · cat · tac · chmod · grep · diff · sed · ar · man · pushd · popd · fsck · testdisk · seq · fd · pandoc · cd · $PATH · awk · join · jq · fold · uniq · journalctl · tail · stat · ls · fstab · echo · less · chgrp · chown · rev · look · strings · type · rename · zip · unzip · mount · umount · install · fdisk · mkfs · rm · rmdir · rsync · df · gpg · vi · nano · mkdir · du · ln · patch · convert · rclone · shred · srm · scp · gzip · chattr · cut · find · umask · wc · tr | | | Processes | alias · screen · top · nice · renice · progress · strace · systemd · tmux · chsh · history · at · batch · free · which · dmesg · chfn · usermod · ps · chroot · xargs · tty · pinky · lsof · vmstat · timeout · wall · yes · kill · sleep · sudo · su · time · groupadd · usermod · groups · lshw · shutdown · reboot · halt · poweroff · passwd · lscpu · crontab · date · bg · fg · pidof · nohup · pmap | | | Networking | netstat · ping · traceroute · ip · ss · whois · fail2ban · bmon · dig · finger · nmap · ftp · curl · wget · who · whoami · w · iptables · ssh-keygen · ufw · arping · firewalld | |

RELATED: Best Linux Laptops for Developers and Enthusiasts


Итог: история bash — мощный инструмент для ускорения работы в терминале. Настройте переменные, используйте безопасные практики и расширения вроде fzf, чтобы сделать работу с историей надежной и удобной.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Firefox как браузер по умолчанию на Mac
Инструкции

Firefox как браузер по умолчанию на Mac

Обновление Windows 10 до Windows 11 — руководство
Windows

Обновление Windows 10 до Windows 11 — руководство

Конвертация изображений в Go
Go изображения

Конвертация изображений в Go

JUnit Assertions: руководство и cheat‑sheet
Тестирование

JUnit Assertions: руководство и cheat‑sheet

Spotify Web Player — слушать в браузере
Музыка

Spotify Web Player — слушать в браузере

Ready Player Me — единый 3D‑аватар для метавселенной
Метавселенная

Ready Player Me — единый 3D‑аватар для метавселенной