Чтобы понять поведение истории bash, вы должны знать следующее:
- В файле истории есть история.
- В памяти процесса bash есть история.
- История в памяти одного процесса bash не синхронизируется с историей в памяти любого другого процесса bash.
- История в памяти процесса bash не синхронизируется с историей в файле, если явно не задан или во время какого-то определенного события (см. Ниже).
Используя настройки по умолчанию, жизненный цикл сеанса bash с учетом истории выглядит следующим образом:
- Во время запуска bash прочитает файл истории. Содержимое файла истории теперь находится в памяти процесса bash.
- При нормальном использовании манипулируется только история в памяти.
- Во время выключения история в памяти записывается в файл истории, перезаписывая любое предыдущее содержимое файла истории.
Кажущееся недетерминированным поведение, которое вы наблюдали, главным образом потому, что содержимое файла истории всегда является историей последнего закрытого сеанса bash, а bash читает файл истории только во время запуска.
Прочитайте руководство по bash для более подробного объяснения процесса запуска и завершения работы.
Обратите внимание, что под настройками по умолчанию я имею в виду настройки по умолчанию из bash. Ваш дистрибутив мог предоставить .bashrc
(или /etc/bash.bashrc
), которые изменяют это поведение.
Включив параметр оболочки, histappend
вы можете указать bash добавить вместо перезаписи файла истории. Вы можете включить histappend
с помощью команды shopt -s histappend
. Чтобы эта опция всегда была включена, вы должны поместить команду в свой .bashrc
(или другой файл инициализации). Узнайте больше о shopt
команде в руководстве bash
Обратите внимание, что включение histappend
не сильно уменьшит кажущееся недетерминированным поведение. Это потому, что каждый сеанс bash все еще имеет свою историю в памяти. Возможно иметь в основном синхронизированную историю bash. Существует руководство, как заставить каждый процесс bash иметь синхронизированную историю в потоке при переполнении стека .
используя встроенную команду, history
вы можете явно указать bash прочитать историю из файла в память или выполнить запись из памяти в файл. Например: history -r
прочтет содержимое файла и добавит его в историю в памяти. history -w
запишет текущую историю из памяти в файл, переписав предыдущий контент. Это в основном то, что происходит во время выключения. Узнайте больше о history
команде в руководстве bash
Для полноты здесь приведен список внутренних переменных, которые изменяют поведение истории:
HISTFILE
: файл для чтения и записи истории.
HISTFILESIZE
: максимальное количество строк для файла истории.
HISTSIZE
: максимальное количество строк для истории в памяти.
HISTCONTROL
, HISTIGNORE
, HISTTIMEFORMAT
: Не имеет отношения к этой дискуссии. Прочитайте руководство bash для деталей.