Ответ
Команда history работает с двумя областями: оперативной памятью текущей сессии и файлом на диске. Вот как это устроено:
1. Файл истории на диске (постоянное хранение):
- Bash:
~/.bash_history - Zsh:
~/.zsh_history - Fish:
~/.local/share/fish/fish_history
При нормальном завершении сессии оболочка дописывает команды из оперативной памяти в этот файл.
2. Память текущей сессии:
Команды, введённые в текущем сеансе, сначала сохраняются в оперативной памяти (буфер истории). Команда history отображает именно этот буфер. При выходе из оболочки он сливается в файл.
3. Ключевые переменные окружения, которые этим управляют:
# HISTFILE - путь к файлу истории (например, ~/.bash_history)
export HISTFILE=~/.bash_history
# HISTSIZE - максимальное количество команд, хранимых в памяти текущей сессии
export HISTSIZE=5000
# HISTFILESIZE - максимальное количество команд, хранимых в файле истории
export HISTFILESIZE=10000
# HISTCONTROL - управление логированием (ignorespace, ignoredups, ignoreboth)
export HISTCONTROL=ignoreboth # не сохранять команды, начинающиеся с пробела, и дубликаты подряд
# HISTTIMEFORMAT - добавление временных меток к истории
export HISTTIMEFORMAT="%d/%m/%y %T "
# Тогда `history` выведет:
# 1015 28/03/25 14:30:15 ssh prod-server
4. Практические примеры управления:
# Просмотр истории с номерами строк
history
# Выполнить команду под номером 1015
!1015
# Поиск по истории (чаще использую Ctrl+R reverse-i-search)
history | grep "ssh"
# Очистить только буфер в памяти текущей сессии
history -c
# Важно: это не очистит ~/.bash_history! Файл очистится только при следующем выходе/перезаписи.
# Немедленно записать все команды из памяти в файл (без выхода из сессии)
history -w
# Удалить конкретную запись из истории в памяти (например, строку 1015)
history -d 1015
5. Особенности для DevOps:
- В скриптах автоматизации часто отключают историю для неинтерактивных сессий:
set +o history. - Для аудита действий на критичных серверах настраивают централизованный сбор истории команд через
auditdили отправку~/.bash_historyв SIEM (например, Elasticsearch).