HISTSIZE и HISTFILESIZE в bash (linux)

HISTSIZE и HISTFILESIZE используются для расширения истории bash чтобы хранить больше 500 строк (по умолчанию). Рассмотрим чем они отличаются.

Чтобы переустановить эти переменные укажите их в ~/.bachrc.

Есть еще константа HISTTIMEFORMAT которая позволяет указать формат вывода команды history.

HISTTIMEFORMAT="%Y-%m-%d %T "

Файл истории команд:

$ echo $HISTFILE
/home/user/.bash_history

Разница между HISTSIZE и HISTFILESIZE

HISTSIZE - это количество строк (команд), которые хранятся в памяти во время сессии bash.

HISTFILESIZE - это количество строк (команд), которые:

  • (а) допускаются в файл истории при запуске сессии.
  • (б) сохраняются в файле истории по окончании сессии bash (для использования в будущих сессиях).

Обратите внимание, что FILE означает хранится на диске (в файле).

man bash:

Значение переменной HISTSIZE используется как количество команд для сохранения в списке истории. Сохраняется текст последних команд HISTSIZE (по умолчанию 500). (...)

При запуске история инициализируется из файла, названного переменной HISTFILE (по умолчанию ~/.bash_history). Файл, названный значением HISTFILE, при необходимости усекается, чтобы содержать не более количества строк, заданного значением HISTFILESIZE. (...) При выходе из интерактивной оболочки последние строки $HISTSIZE копируются из списка истории в $HISTFILE. Если включена опция оболочки histappend (см. описание shopt в разделе КОМАНДЫ ОБОЛОЧКИ ниже), строки добавляются в файл истории, в противном случае файл истории перезаписывается. Если HISTFILE не установлен или если файл истории недоступен для записи, история не сохраняется. (...) После сохранения истории файл истории усекается и содержит не более HISTFILESIZE строк. Если HISTFILESIZE не задано, усечение не выполняется.

Примеры:

Пример 1: HISTFILESIZE=10 и HISTSIZE=10.

  1. Вы начинаете сессию.

  2. Ваш HISTFILE (файл, хранящий историю команд bash), урезается и содержит HISTFILESIZE=10 строк.

  3. Вы пишете 50 строк.

  4. В конце ваших 50 команд в списке истории, размер которого определяется HISTSIZE=10, находятся только команды с 41 по 50.

  5. Вы завершаете сеанс работы.

  6. Если histappend не включен, команды с 41 по 50 сохраняются в вашем HISTFILE, который теперь содержит 10 команд, которые были в начале, плюс 10 новых записанных команд.

  7. Ваш HISTFILE урезан и содержит HISTFILESIZE=10 строк.

  8. Теперь в вашей истории есть 10 команд - последние 10, которые вы только что набрали в сеансе, который вы только что закончили.

  9. Когда вы начинаете новый сеанс, вы начинаете с 1 с HISTFILE с HISTFILESIZE=10.

Пример 2: HISTFILESIZE=10 и HISTSIZE=5.

  1. Вы начинаете свою сессию.

  2. Ваш HISTFILE (файл, хранящий историю команд bash) урезан и содержит не более 10 строк HISTFILESIZE=10.

  3. Вы пишете 50 строк.

  4. В конце выполнения 50 команд в списке истории, размер которого определяется HISTSIZE=5, находятся только команды с 46 по 50.

  5. Вы завершаете сеанс работы.

  6. Если histappend не включен, команды с 46 по 50 сохраняются в вашем HISTFILE, который теперь содержит 10 команд, которые были в начале, плюс 5 новых записанных команд.

  7. Ваш HISTFILE урезан и содержит HISTFILESIZE=10 строк.

  8. Теперь у вас в истории 10 команд - 5 из предыдущего сеанса и последние 5, которые вы только что набрали в сеансе, который вы только что закончили.

  9. Когда вы начинаете новый сеанс, вы начинаете с 1 с HISTFILE с HISTFILESIZE=10.

Пример 3: HISTFILESIZE=5 и HISTSIZE=10.

  1. Вы начинаете свой сеанс.

  2. Ваш HISTFILE (файл, хранящий историю команд bash) усечен и содержит не более 5 строк HISTFILESIZE=5.

  3. Вы пишете 50 строк.

  4. В конце выполнения 50 команд в списке истории, размер которого определяется HISTSIZE=10, находятся только команды с 41 по 50.

  5. Вы завершаете сеанс работы.

  6. Если histappend не включен, команды с 41 по 50 сохраняются в вашем HISTFILE, который теперь содержит 5 команд, которые были в начале, плюс 10 новых записанных команд.

  7. Ваш HISTFILE усечен и содержит HISTFILESIZE=5 строк.

  8. Теперь в вашей истории есть 5 команд - последние 5, которые вы только что набрали в сеансе, который вы только что закончили.

  9. Когда вы начинаете новый сеанс, вы начинаете с шага 1 с HISTFILE с HISTFILESIZE=5.

Информация из elixir_sinari:

Файл истории" не обновляется по мере ввода команд. Команды сохраняются в отдельном "списке" (доступ к которому осуществляется командой history). Количество этих сохраненных команд контролируется значением HISTSIZE. Когда оболочка (интерактивная) завершается, последние строки $HISTSIZE копируются/добавляются в $HISTFILE из этого "списка". Если установлено значение HISTFILESIZE, то после этой операции гарантируется, что в $HISTFILESIZE в $HISTFILE есть только $HISTFILESIZE строк (последние). И когда запускается оболочка, "список" инициализируется из $HISTFILE до максимального количества команд $HISTSIZE.

--

Перевод https://stackoverflow.com/questions/19454837/bash-histsize-vs-histfilesize