bash HISTSIZE vs. HISTFILESIZE?


174

Яка різниця в HISTSIZEпорівнянні з HISTFILESIZE?

Вони використовуються для розширення історії bash за межі 500 рядків за замовчуванням.

Здається, тут і на інших форумах не вистачає ясності щодо того, чому вони потрібні обом. ( Приклад 1 , Приклад 2 , Приклад 3 ).

Відповіді:


289

Коротка відповідь:

HISTSIZE - це кількість рядків або команд, які зберігаються в пам'яті в списку історії, поки триває ваш баш-сеанс.

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 із ІСТИЧНОГО ІСТИЧНОГО ХАРАКТЕРИСТИКИ = 5.

Інформація від elixir_sinari :

Історія "файл" не оновлюється під час введення команд. Команди зберігаються в "списку" окремо (до них звертається команда "історія"). Кількість цих збережених команд контролюється значенням HISTSIZE. Коли оболонка (інтерактивна) закінчується, останні рядки $ HISTSIZE копіюються / додаються до $ HISTFILE із цього "списку". Якщо встановлено HISTFILESIZE, то після цієї операції гарантується, що в $ HISTFILE існує лише рядки $ HISTFILESIZE (останні). І коли запускається оболонка, "список" ініціалізується з $ HISTFILE до максимум $ HISTSIZE команд.

І зі man bashсторінки:

Значення змінної HISTSIZE використовується як кількість команд для збереження у списку історії. Текст останніх команд HISTSIZE (500 за замовчуванням) зберігається. (...)

При запуску історія ініціалізується з файла, названого змінною HISTFILE (за замовчуванням ~ / .bash_history). Файл, названий значенням HISTFILE, усічується, якщо необхідно, щоб містити не більше кількості рядків, визначених значенням HISTFILESIZE. (...) Коли інтерактивна оболонка виходить, останні рядки $ HISTSIZE копіюються зі списку історії в $ HISTFILE. Якщо параметр оболонки histappend увімкнено (див. Опис простріляного під командою SHELL BUILTIN COMMANDS нижче), рядки додаються до файлу історії, інакше файл історії буде перезаписаний. Якщо HISTFILE не встановлено, або якщо файл історії непридатний, історія не зберігається. (...) Після збереження історії файл історії обрізається, щоб містити не більше рядків HISTFILESIZE. Якщо HISTFILESIZE не встановлено,


27
+1 Ця відповідь вражаюче ґрунтовна! Трохи занадто багато, я думаю. Більшість людей не досягнуть кінця. Думаю, вам варто подумати про його підведення
slezica

22
@slezica Я не згоден з другою частиною вашого коментаря: я дійшов до кінця і можу сказати, що кожен фрагмент інформації у відповіді корисний. Те, що деякі люди лінуються прочитати кілька рядків, не повинно виправдовувати видалення корисної інформації для інших.
Бастієн

1
@Bastien якщо припустити, що ти розбираєш кульову точку, у тебе не буде труднощів при прочитанні цього.
Пітікос

6
Подивіться, мій жорсткий диск становить 1 ТБ і в основному порожній, і у мене є крутики непрацюючих циклів процесора та оперативної пам’яті, і я хочу зберегти якомога більшу кількість баш-історії - тому коли мені потрібно шукати цю дурну команду, я не маю ' я не пробіжусь за два роки, я знаю, що це в моїй історії баш. Щоб зробити це більш конкретним, скажімо, до 50 Мб історії башу. Які значення ви рекомендуєте?
CivFan

2
@Matthew вибач, не знаю цього!
arturomp

6

На основі більш того, що сказав arturomp, і намагаючись зробити це трохи зрозумілішим.

Якщо припустити, що у вас 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. Наприклад, з a 2033 HISTFILESIZE, у моєму випадку я мав би це:

~$ history
    1  fghfghdf
    2  gegege
    3  gege
   ..  ..
 2028  HISTSIZE=5
 2029  GGH
 2030  GSDHFG
 2031  JFDR
 2032  ABSDDS
 2033  AHFGHFD

3
Які значення ви б рекомендували, якщо я хочу, щоб вся історія з усіх одночасних терміналів назавжди зберігалася в історії башів ? Іншими словами, завжди зберігайте все, і ніколи нічого не видаляйте.
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'. Оскільки вони нечислові, вони зберігають усе. Дякую за пораду!
Коннор
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.