Откуда команда `history` в Linux считывает список ранее выполненных команд?

«Откуда команда `history` в Linux считывает список ранее выполненных команд?» — вопрос из категории Linux, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Команда 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).