Введение / Зачем это нужно
Команда history — один из самых мощных инструментов для повышения продуктивности в командной строке Linux. Она записывает все введённые вами команды, позволяя:
- Быстро находить и повторять ранее использованные сложные команды без перепечатывания.
- Анализировать свои действия, например, для документирования рутинных операций.
- Управлять сессиями, очищая ненужные или конфиденциальные записи.
Это руководство превратит вашу историю команд из простого лога в удобный инструмент поиска и автоматизации.
Требования / Подготовка
- Доступ к терминалу (Ctrl+Alt+T или аналогичный).
- Оболочка (shell): инструкция в основном для
bash(стандартная в большинстве дистрибутивов), но большинство принципов применимо и кzsh. - Права на запись в домашний каталог (файл
~/.bash_historyили~/.zsh_history). - Текстовый редактор (например,
nanoилиvim) для редактирования конфигурационных файлов.
Шаг 1: Просмотр и поиск в истории
1.1. Базовый просмотр
Просто введите команду, чтобы увидеть список всех сохранённых команд с номерами:
history
По умолчанию выводится 500 или 1000 последних записей (зависит от настройки HISTSIZE).
1.2. Поиск по содержимому
Чтобы найти команду, содержащую конкретный текст (например, systemctl), используйте grep:
history | grep systemctl
Это отфильтрует только те строки, где встречается слово systemctl.
1.3. Поиск с помощью сочетаний клавиш (в интерактивном режиме)
Ctrl + R— реверсивный поиск. Начните вводить часть команды, и терминал будет показывать первое совпадение. НажимайтеCtrl + Rдля перебора других.Enter— выполнить,Ctrl + G— выйти из поиска.↑/↓— прокрутка по последним командам.
Шаг 2: Повторение и редактирование прошлых команд
2.1. Быстрое повторение
!!— выполнить последнюю команду. Полезно послеsudo(например,sudo !!).!-n— выполнить команду, которая былаnшагов назад.!-2— предпоследняя.!<строка>— выполнить последнюю команду, начинающуюся с<строка>. Например,!sysвыполнит последнюю команду, которая начиналась сsys.
2.2. Редактирование перед выполнением
- После нахождения команды через
Ctrl + Rнажмите←или→, чтобы выйти из режима поиска и отредактировать строку. - Или найдите команду стрелками
↑/↓и редактируйте её как обычную строку ввода.
Шаг 3: Настройка размера и формата истории
По умолчанию история может быть ограничена. Давайте это изменим.
3.1. Увеличение количества сохраняемых команд
Откройте конфигурационный файл вашей оболочки. Для bash это обычно ~/.bashrc:
nano ~/.bashrc
Добавьте или измените строки в конце файла:
# Максимальное количество команд в памяти сессии
HISTSIZE=5000
# Максимальное количество команд в файле истории
HISTFILESIZE=10000
Сохраните (Ctrl+O, Enter) и закройте (Ctrl+X) редактор. Чтобы изменения вступили в силу в текущей сессии, выполните:
source ~/.bashrc
3.2. Добавление времени выполнения команд
Для аудита или анализа полезно видеть, когда команда была запущена. Добавьте в ~/.bashrc:
# Формат: Год-Месяц-День Часы:Минуты:Секунды
export HISTTIMEFORMAT='%F %T '
После source ~/.bashrc команда history будет выводить время перед каждой командой.
💡 Совет: Для
zshиспользуйте переменнуюHISTTIMEFORMATаналогично или настройте черезsetopt EXTENDED_HISTORY.
Шаг 4: Очистка и управление файлом истории
4.1. Очистка текущей сессии (оперативной памяти)
history -c
Это удалит все записи из текущей сессии, но не затронет файл ~/.bash_history на диске.
4.2. Очистка файла истории на диске
Чтобы стереть историю и в файле, выполните две команды:
history -c # 1. Очищаем оперативную память
history -w # 2. Записываем (пустую) оперативную память в файл ~/.bash_history
Внимание: Это действие необратимо для текущего пользователя.
4.3. Удаление конкретной записи
- Узнайте номер строки команды через
history. - Удалите её:
history -d <номер_строки> - Немедленно синхронизируйте с файлом:
history -w
4.4. Отключение записи истории (временное)
Для конфиденциальных операций (например, ввода паролей в открытом виде, что крайне не рекомендуется) можно временно отключить запись:
set +o history # Отключить запись текущей сессии
# ... выполняем конфиденциальные команды ...
set -o history # Включить запись обратно
Важно: Команды, введённые в отключённом режиме, не попадут в историю, но могут быть видны в процессе (ps aux) или в кэше терминала.
Шаг 5: Полезные продвинутые приёмы
5.1. Выполнение команды из истории по номеру
!<номер>
Например, !123 выполнит команду под номером 123.
5.2. Подстановка аргументов из предыдущей команды
!$— последний аргумент последней команды. Полезно для операций с одним и тем же файлом:cp file.txt backup.txt && mv !$ new_name.txt.!*— все аргументы, кроме первой команды.
5.3. Экспорт истории в файл для анализа
history > my_history.txt
Теперь у вас есть текстовый файл со всей историей для поиска или документирования.
Проверка результата
- Выполните несколько разных команд (
ls,pwd,echo "test"). - Введите
history— они должны отобразиться. - Если вы настраивали
HISTTIMEFORMAT, убедитесь, что время отображается. - Попробуйте поиск через
Ctrl+R— должен находить ваши команды. - Проверьте размер файла истории:
ls -la ~/.bash_history.
Если команды появляются в выводе history и сохраняются после закрытия и повторного открытия терминала — настройка работает корректно.
Возможные проблемы
| Проблема | Возможная причина | Решение |
|---|---|---|
| История пуста после перезапуска терминала | Переменная HISTSIZE установлена в 0 в ~/.bashrc или ~/.profile. | Проверьте эти файлы на наличие HISTSIZE=0 и исправьте. |
Не сохраняются команды, введённые через sudo | История по умолчанию записывается от имени текущего пользователя. Команды, выполненные через sudo, могут логироваться в истории root (/root/.bash_history). | Для записи команд sudo в вашу историю настройте sudo (опция timestamp_timeout), но это может быть небезопасно. |
| История "прыгает" или теряет записи | Файл ~/.bash_history повреждён или имеет неверные права. | Убедитесь, что владелец файла — вы: ls -la ~/.bash_history. При необходимости удалите файл (он создастся заново) и настройте HISTFILESIZE заново. |
history -w не записывает изменения | Вы находитесь в su или sudo su сессии. Файл истории пытается записаться от root. | Выйдите из сессии root (exit) или настройте HISTFILE для root-сессии. |
Часто задаваемые вопросы (FAQ)
Можно ли синхронизировать историю между несколькими окнами терминала?
Да, но с оговорками. По умолчанию каждая сессия оболочки считывает историю при старте и записывает её при выходе. При работе в нескольких окнах одновременно последние команды из одного окна не появятся в другом, пока вы не выйдете из первой сессии. Чтобы получать обновления "на лету", можно использовать history -a (добавить текущие команды в файл) и history -n (прочитать новые строки из файла) вручную или настроить PROMPT_COMMAND в ~/.bashrc:
export PROMPT_COMMAND='history -a; history -n'
Как найти и выполнить команду, которая содержала опечатку?
Используйте поиск по части remembered команды. Например, если вы хотели ввести git commit, но напечатали git comit, найдите через history | grep comit, получите номер и выполните !<номер> или просто найдите стрелками и исправьте.
Безопасно ли хранить всю историю?
Нет. История — это plain-text файл (~/.bash_history), доступный для чтения любому, у кого есть доступ к вашему аккаунту. Никогда не вводите в терминал пароли, ключи API или другие секреты. Для конфиденциальных операций используйте отключение истории (set +o history) или специальные утилиты (например, ssh-keygen для паролей не требует ввода в историю).
Почему команда history показывает меньше строк, чем я ожидал?
Проверьте две переменные: echo $HISTSIZE (лимит для текущей сессии) и echo $HISTFILESIZE (лимит для файла). Также убедитесь, что вы не очищали историю ранее. Файл ~/.bash_history может быть скрыт или находиться в нестандартном месте (проверьте echo $HISTFILE).