bash HISTSIZE против HISTFILESIZE?

174

Какая разница в HISTSIZEсравнении с HISTFILESIZE?

Они используются для расширения истории bash за пределы 500 строк по умолчанию.

Кажется, здесь и на других форумах нет ясности относительно того, почему они оба необходимы. ( Пример 1 , Пример 2 , Пример 3 ).

arturomp
источник

Ответы:

289

Короткий ответ:

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

HISTFILESIZE количество строк или команд, которые (a) разрешены в файле истории во время запуска сеанса, и (b) сохранены в файле истории в конце сеанса bash для использования в будущих сеансах.

Обратите внимание на различие между file: на диске - и list: в памяти.

Длинный ответ:

Вся информация выше + несколько примеров:

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

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

arturomp
источник
27
+1 Этот ответ впечатляюще тщательный! Я думаю, это слишком много. Большинство людей не дойдут до конца. Я думаю, что вы должны подумать об этом
slezica
22
@slezica Я не согласен со второй частью вашего комментария: я дошел до конца, и я могу сказать, что каждый бит информации в ответе полезен. Тот факт, что некоторые люди слишком ленивы, чтобы прочитать несколько строк, не должен оправдывать удаление полезной информации для других.
Бастьен
1
@Bastien, если вы разбираете пули, у вас не возникнет проблем с чтением.
Питикос
6
Послушайте, мой жесткий диск занимает 1 ТБ и в основном пустой, и у меня есть свободные циклы ЦП и ОЗУ, и я хочу сохранить как можно больше истории bash, поэтому, когда мне нужно найти эту глупую команду, которой у меня нет я не буду работать через два года, я знаю, что это в моей истории bash. Чтобы сделать его более конкретным, скажем, до 50 МБ истории Bash. Какие ценности вы рекомендуете?
CivFan
2
@ Матвей, извини, не знаю!
arturomp
6

Основываясь на том, что сказал Артуромп, и чтобы сделать это немного яснее.

Предполагая, что у вас есть 2000-летняя история ..

~$ history
    1  sdf
    2  fghdfgjf
    3  fghfghdf
   ..  ..
 2027  78
 2028  57
 2029  yu45u

Вы можете сократить то, что вам показывают HISTSIZE

~$ HISTSIZE=5
~$ history
 2026  546
 2027  78
 2028  56
 2029  yu45u
 2030  HISTSIZE=5

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

~$ ABC
~$ GGH
~$ GSDHFG
~$ JFDR
~$ ABSDDS
~$ AHFGHFD
<close terminal>
<open new terminal>
~$ history
    1  sdf
    2  fghdfgjf
    3  fghfghdf
   ..  ..
 2028  56
 2029  yu45u
 2030  HISTSIZE=5
 2031  GGH
 2032  GSDHFG
 2033  JFDR
 2034  ABSDDS
 2035  AHFGHFD

Мы ясно видим, что нашей первой команды («ABC») нет в истории, поскольку были записаны только последние 5 команд.

Теперь общая история сохраняется в файле ( .bash_history), и вы можете изменить время, которое этот файл получает с HISTFILESIZE. Например, с 2033 HISTFILESIZE, в моем случае у меня было бы это:

~$ history
    1  fghfghdf
    2  gegege
    3  gege
   ..  ..
 2028  HISTSIZE=5
 2029  GGH
 2030  GSDHFG
 2031  JFDR
 2032  ABSDDS
 2033  AHFGHFD
Pithikos
источник
3
Какие значения вы бы порекомендовали, если я хочу, чтобы вся история со всех одновременно работающих терминалов сохранялась в истории bash, навсегда ? Другими словами, всегда сохраняйте все и никогда ничего не удаляйте.
CivFan
10
@CivFan: установить HISTSIZE=-1и HISTFILESIZE=-1.
М. Дадли,
2
Это совершенно неправильно. Установка его в -1 все очистит.
Брендан Берд
3
@BrendanByrd На bashстранице руководства написано: Non-numeric values and numeric values less than zero inhibit truncationно тогда у меня не хватило смелости проверить, правда ли это, потому что я не хочу терять свою историю :-)
SebMa
3
@SebMa Я изменил свои настройки на HISTSIZE='INFINITY'и HISTFILESIZE='ANDBEYOND'. Поскольку они не числовые, они сохраняют все. Спасибо за чаевые!
Коннор