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.
-
Вы начинаете сессию.
-
Ваш HISTFILE (файл, хранящий историю команд bash), урезается и содержит HISTFILESIZE=10 строк.
-
Вы пишете 50 строк.
-
В конце ваших 50 команд в списке истории, размер которого определяется HISTSIZE=10, находятся только команды с 41 по 50.
-
Вы завершаете сеанс работы.
-
Если histappend не включен, команды с 41 по 50 сохраняются в вашем HISTFILE, который теперь содержит 10 команд, которые были в начале, плюс 10 новых записанных команд.
-
Ваш HISTFILE урезан и содержит HISTFILESIZE=10 строк.
-
Теперь в вашей истории есть 10 команд - последние 10, которые вы только что набрали в сеансе, который вы только что закончили.
- Когда вы начинаете новый сеанс, вы начинаете с 1 с HISTFILE с HISTFILESIZE=10.
Пример 2: HISTFILESIZE=10 и HISTSIZE=5.
-
Вы начинаете свою сессию.
-
Ваш HISTFILE (файл, хранящий историю команд bash) урезан и содержит не более 10 строк HISTFILESIZE=10.
-
Вы пишете 50 строк.
-
В конце выполнения 50 команд в списке истории, размер которого определяется HISTSIZE=5, находятся только команды с 46 по 50.
-
Вы завершаете сеанс работы.
-
Если histappend не включен, команды с 46 по 50 сохраняются в вашем HISTFILE, который теперь содержит 10 команд, которые были в начале, плюс 5 новых записанных команд.
-
Ваш HISTFILE урезан и содержит HISTFILESIZE=10 строк.
-
Теперь у вас в истории 10 команд - 5 из предыдущего сеанса и последние 5, которые вы только что набрали в сеансе, который вы только что закончили.
- Когда вы начинаете новый сеанс, вы начинаете с 1 с HISTFILE с HISTFILESIZE=10.
Пример 3: HISTFILESIZE=5 и HISTSIZE=10.
-
Вы начинаете свой сеанс.
-
Ваш HISTFILE (файл, хранящий историю команд bash) усечен и содержит не более 5 строк HISTFILESIZE=5.
-
Вы пишете 50 строк.
-
В конце выполнения 50 команд в списке истории, размер которого определяется HISTSIZE=10, находятся только команды с 41 по 50.
-
Вы завершаете сеанс работы.
-
Если histappend не включен, команды с 41 по 50 сохраняются в вашем HISTFILE, который теперь содержит 5 команд, которые были в начале, плюс 10 новых записанных команд.
-
Ваш HISTFILE усечен и содержит HISTFILESIZE=5 строк.
-
Теперь в вашей истории есть 5 команд - последние 5, которые вы только что набрали в сеансе, который вы только что закончили.
- Когда вы начинаете новый сеанс, вы начинаете с шага 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