Як довго триває вміст файлу .bash_history?


11

Як я можу змінити вміст свого bash_historyфайлу? Які значення чи змінні контролюють тривалість історії? Чи є якісь інші речі, які я можу змінити, щоб забезпечити більш точний контроль над моєю історією БАШ ??



2
Я не вірю, що цей файл контролюється тривалістю часу, але, проте, але максимальним розміром файлу. Дивіться тут: Чи є спосіб встановити розмір списку історії в bash більше 5000 рядків? . Тож заздрість. змінні HISTSIZEі HISTFILESIZEє єдиними контрольними поверхнями, якими ви маєте контролювати, скільки історій зберігається.
slm

Відповіді:


12

Є дві змінні, які керують розміром історії:

HISTFILESIZE Максимальна кількість рядків, що містяться у файлі історії. Коли цій змінній присвоюється значення, файл історії врізається, якщо необхідно, щоб містити не більше тієї кількості рядків, видаляючи найдавніші записи. Файл історії також прирізається до цього розміру після його запису при виході оболонки. Якщо значення дорівнює 0, файл історії обрізається до нульового розміру. Нечислові та числові значення менше нуля гальмують усічення. Оболонка встановлює за замовчуванням значення HISTSIZE після читання будь-яких файлів запуску.

і

HISTSIZE Кількість команд, які слід запам'ятати в історії команд (див. ІСТОРІЯ нижче). Якщо значення дорівнює 0, команди не зберігаються у списку історії. Числові значення менше нуля призводять до того, що кожна команда зберігається у списку історії (обмеження немає). Оболонка встановлює значення за замовчуванням на 500 після читання будь-яких файлів запуску.

Ці дві змінні дозволяють контролювати поведінку вашої історії. По суті, HISTSIZEце кількість команд, збережених під час вашого поточного сеансу, і HISTFILESIZEце кількість команд, які запам'ятаються протягом сеансів. Так, наприклад:

$ echo $HISTSIZE 
10
$ echo $HISTFILESIZE 
5
$ history | wc
     10      29     173

У наведеному вище прикладі, оскільки HISTSIZEвстановлено значення 10, historyповертає список з 10 команд. Однак якщо ви вийдете з системи, а потім знову ввійдете в систему, historyповерне лише 5 команд, оскільки HISTFILESIZEвстановлено 5. Це відбувається тому, що після виходу з сеансу HISTFILESIZEрядки вашої історії зберігаються у вашому файлі історії ( ~/.bash_historyза замовчуванням, але контролюється HISTFILE). Іншими словами, команди додаються до HISTFILEтих пір, поки не досягне $HISTFILESIZEрядків, в який момент кожен наступний доданий рядок означає, що перша команда файлу буде видалена.

Ви можете встановити значення цих змінних у своєму ~/.profile(або ~/.bash_profileякщо такий файл існує). Не встановлюйте їх по- ~/.bashrcперше, тому що у них немає роботи, а по-друге, тому що це призведе до різної поведінки в системі реєстрації проти оболонок без входу, що може призвести до інших проблем .

Іншими корисними змінними, які дозволяють точно налаштувати поведінку вашої історії, є:

  • HISTIGNORE: Це дозволяє ігнорувати певні загальні команди, які рідко представляють інтерес. Наприклад, ви можете встановити:

    export HISTIGNORE="pwd:df:du"

    Це призведе до того, що будь-яка команда, що починається з pwd, dfабо duігнорується та не зберігається у вашій історії.

  • HISTCONTROL: Цей дозволяє вибирати, як працює історія. Особисто я встановив, HISTCONTROL=ignoredupsщо змушує його зберігати дублювані команди лише один раз. Інші варіанти - ignorespaceігнорувати команди, починаючи з пробілу, і erasedupsце призводить до того, що всі попередні рядки, що відповідають поточному рядку, будуть видалені зі списку історії до того, як цей рядок буде збережено. ignorebothце скорочення для простору ігнорування та ігнорування.

  • HISTTIMEFORMAT: Це дозволяє встановити формат часу файлу історії. Дивіться відповідь Панді або читайте man bashподробиці.


Для подальшої тонкої настройки ви маєте:

  • Варіант histappendбаш. Це можна встановити, запустивши shopt -s histappendабо додавши цю команду до своєї ~/.bashrc. Якщо цей параметр встановлений

    список історії додається до файла, названого значенням змінної HISTFILE, коли оболонка виходить, а не перезаписує файл.

    Це дуже корисно, оскільки дозволяє поєднувати історії різних сеансів (наприклад, думати різні термінали).

  • У historyкоманди є два корисні варіанти:

    • history -a : викликає автоматичну запис останньої команди у файл історії

    • history -r : імпортує файл історії в поточний сеанс.

    Наприклад, ви можете додати ці дві команди у свою команду PROMPT_COMMAND(яка виконується кожного разу, коли оболонка показує підказку, тому щоразу, коли ви запускаєте нову оболонку та після кожної команди, виконайте її):

    export PROMPT_COMMAND='history -a;history -r;'

    У поєднанні вони гарантують, що будь-який новий термінал, який ви відкриєте, негайно імпортує історію будь-яких інших сеансів оболонки. Результат - загальна історія для всіх терміналів / сесій оболонки.


2

Розмір файлу історії за замовчуванням - 500 рядків. Як тільки файл .bash_history досягає 500 рядків, ранні записи видаляються, щоб звільнити місце для новіших рядків, як у FIFO. Ви можете змінити це, змінивши значення змінної, HISTFILESIZEяка за замовчуванням має значення 500.

Якщо ввести HISTFILESIZE=10000.bashrc, ви збільшите кількість рядків, які може містити файл історії до 10000, тим самим збільшивши термін його вмісту.


2
Примітка: якщо ви зробите HISTSIZEліміт, також подумайте про зміну HISTFILE. Якщо запустити bash --norc HISTSIZE, повернеться до значення за замовчуванням, обрізаючи свій HISTFILEпри виході.
llua

Дякую, @llua. Аналогічно, якщо у вашій системі /etc/bash.bashrcвстановлено HISTFILESIZE(або, можливо HISTSIZE, я не перевірив, який), то, схоже, Bash скорочується .bash_historyв точці, яку він читає /etc/bash.bashrc(або принаймні в якийсь момент, перш ніж буде встановлено новий ліміт у ваших власних файлах Bash init). Щоб уникнути цього, знову ж таки, встановіть свою власну, HISTFILEщоб ваша реальна історія пішла туди, а не у .bash_historyфайл, який Bash обрізає.
Кріс Повірк

(Але чи не exportтак, оскільки це зробить видимими будь-які дитячі снаряди, які потім зможуть .bash_history
усікати

0

Детальніше man bashпро історію башу читайте, як:

ІСТКОНТРОЛ
       Список значень, розділених двокрапкою, керує тим, як команди зберігаються у списку історії.
       Якщо список значень включає простір ігнорування, рядки, які починаються з символу пробілу, є
       не збережено у списку історії. Значення ігнорених підстав викликає рядки, що відповідають попередньому
       запис історії не зберігається. Значення ignoreboth - це стенограма для ignorespace і
       ігнорування. Значення стирання призводить до того, що всі попередні рядки відповідають поточному рядку
       видалити зі списку історії, перш ніж цей рядок буде збережено. Будь-яке значення, не зазначене вище
       список ігнорується. Якщо HISTCONTROL не встановлено, або не містить дійсного значення, всі рядки
       прочитуваний аналізатором оболонки зберігається у списку історії, залежно від значення HISTIG-
       НІЧЕ. Другий і наступні рядки багаторядкової складеної команди не перевіряються,
       і додаються в історію незалежно від значення HISTCONTROL.
ІСТИНА
       Назва файлу, в якому збережена історія команд (див. ІСТОРІЮ нижче). За замовчуванням
       значення ~ / .bash_history. Якщо не встановлено, історія команд не зберігається при виході оболонки.
ІСТИЛІЗАЦІЯ
       Максимальна кількість рядків, що містяться у файлі історії. Коли ця змінна призначена
       Значення, файл історії усікається, якщо необхідно, щоб містити не більше цього числа
       рядків, видаливши найдавніші записи. Файл історії також обрізаний до цього розміру
       після його написання, коли оболонка виходить. Якщо значення дорівнює 0, файл історії врізається в
       нульовий розмір. Нечислові та числові значення менше нуля гальмують усічення. The
       оболонка встановлює за замовчуванням значення HISTSIZE після читання будь-яких файлів запуску.
ІСТИНА
       Список шаблонів, розділених двокрапкою, використовується для вирішення, на яких командних рядках слід зберігати
       список історії. Кожен візерунок закріплюється на початку рядка і повинен відповідати
       повний рядок (не додається неявна `* '). Кожен малюнок тестується на лінії
       після застосування перевірок, визначених HISTCONTROL. Крім нормальної оболонки
       символи, що відповідають шаблону, `& 'відповідає попередньому рядку історії. `& 'може бути уникнути
       за допомогою зворотної косої риски; зворотний кут знімається перед спробою поєдинку. Другий і
       наступні рядки багаторядкової складної команди не перевіряються і додаються до
       історія незалежно від значення HISTIGNORE.
ІСТИНА
       Кількість команд, які слід пам'ятати в історії команд (див. ІСТОРІЮ нижче). Якщо
       значення 0, команди не зберігаються у списку історії. Числові значення менше нуля
       в результаті кожна команда зберігається у списку історії (обмеження немає). Оболонка
       встановлює значення за замовчуванням на 500 після читання будь-яких файлів запуску.
ХІСТТИМЕФОРМАТ
       Якщо ця змінна встановлена, а не є нульовою, її значення використовується у вигляді рядка формату для строкового перегляду (3)
       друкувати часову марку, пов'язану з кожним записом історії, відображеним історією
       вбудований. Якщо ця змінна встановлена, часові позначки записуються у файл історії, щоб вони могли
       зберігатись протягом сеансів оболонки. Це використовує символ коментування історії для розрізнення
       відзначити часові позначки з інших рядків історії.

Особливо HISTFILESIZEі, HISTSIZEможливо, ви шукаєте і допомагаєте вам.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.