Ответ 1
Короткий ответ:
HISTSIZE
- это количество строк или команд, которые хранятся в памяти в списке истории, пока ваша сессия bash продолжается.
HISTFILESIZE
- это количество строк или команд, которые (a) разрешены в файле истории во время запуска сеанса, и (b) сохранены в файле истории в конце сеанса bash для использования в будущих сеансах.
Обратите внимание на различие между file
: на диске - и list
: в памяти.
Длинный ответ:
Вся информация выше + несколько примеров:
Пример 1: HISTFILESIZE=10
и HISTSIZE=10
- Вы начинаете свою сессию.
- Ваш HISTFILE (файл, в котором хранится история команд bash), усекается до HISTFILESIZE = 10 строк.
- Вы пишете 50 строк.
- В конце ваших 50 команд, в вашем списке истории только команды с 41 по 50, размер которых определяется как HISTSIZE = 10.
- Вы заканчиваете свою сессию.
- Предполагая, что
histappend
не включен, команды с 41 по 50 сохраняются в вашем HISTFILE, который теперь содержит 10 команд, которые он удерживал в начале, плюс 10 вновь написанных команд. - Ваш HISTFILE урезан до HISTFILESIZE = 10 строк.
- Теперь у вас есть 10 команд в вашей истории - последние 10, которые вы только что набрали в сеансе, который вы только что завершили.
- Когда вы начинаете новый сеанс, вы начинаете с 1 с HISTFILE HISTFILESIZE = 10.
Пример 2: HISTFILESIZE=10
и HISTSIZE=5
- Вы начинаете свою сессию.
- Ваш HISTFILE (файл, в котором хранится история команд bash), усекается до не более HISTFILESIZE = 10 строк.
- Вы пишете 50 строк.
- В конце ваших 50 команд, в вашем списке истории только команды с 46 по 50, размер которых определяется как HISTSIZE = 5.
- Вы заканчиваете свою сессию.
- Предполагая, что
histappend
не включен, команды с 46 по 50 сохраняются в вашем HISTFILE, который теперь содержит 10 команд, которые он держал в начале, плюс 5 вновь написанных команд. - Ваш HISTFILE урезан до HISTFILESIZE = 10 строк.
- Теперь у вас есть 10 команд в вашей истории - 5 из предыдущего сеанса и последние 5, которые вы только что набрали в сеансе, который вы только что завершили.
- Когда вы начинаете новый сеанс, вы начинаете с 1 с HISTFILE HISTFILESIZE = 10.
Пример 3: HISTFILESIZE=5
и HISTSIZE=10
- Вы начинаете свою сессию.
- Ваш HISTFILE (файл, в котором хранится история команд bash), усекается до не более HISTFILESIZE = 5 строк.
- Вы пишете 50 строк.
- В конце ваших 50 команд, в вашем списке истории только команды с 41 по 50, размер которых определяется как HISTSIZE = 10.
- Вы заканчиваете свою сессию.
- Предполагая, что
histappend
не включен, команды с 41 по 50 сохраняются в вашем HISTFILE, который теперь содержит 5 команд, которые он удерживал в начале, плюс 10 вновь написанных команд. - Ваш HISTFILE урезан до HISTFILESIZE = 5 строк.
- Теперь у вас есть 5 команд в вашей истории - последние 5, которые вы только что набрали в сеансе, который вы только что закончили.
- Когда вы начинаете новый сеанс, вы начинаете заново с шага 1 с HISTFILE из HISTFILESIZE = 5.
Информация от elixir_sinari:
История файла не обновляется при вводе команд. Команды хранятся в "списке" отдельно (доступ к команде истории). Количество этих сохраненных команд контролируется значением HISTSIZE. Когда оболочка (интерактивная) завершается, последние строки $ HISTSIZE копируются/добавляются в $ HISTFILE из этого "списка". Если HISTFILESIZE установлен, то после этой операции гарантируется, что в $ HISTFILE существуют только строки $ HISTFILESIZE (самые последние). И когда оболочка запускается, "список" инициализируется от $ HISTFILE до максимум команд $ HISTSIZE.
И со страницы man bash
:
Значение переменной HISTSIZE используется в качестве количества команд для сохранения в списке истории. Текст последних команд HISTSIZE (по умолчанию 500) сохраняется. (...)
При запуске история инициализируется из файла, названного переменной HISTFILE (по умолчанию ~/.bash_history). Файл, названный значением HISTFILE, усекается, если необходимо, чтобы он содержал не более количества строк, указанных значением HISTFILESIZE. (...) При выходе из интерактивной оболочки последние строки $ HISTSIZE копируются из списка истории в $ HISTFILE. Если включена опция оболочки histappend (см. Описание shopt в разделе "Команды SHELL BUILTIN" ниже), строки добавляются в файл истории, в противном случае файл истории перезаписывается. Если HISTFILE не установлен или файл истории недоступен для записи, история не сохраняется. (...) После сохранения истории файл истории усекается, чтобы в нем содержалось не более строк HISTFILESIZE. Если HISTFILESIZE не установлен, усечение не выполняется.