Как долго длится содержимое файла .bash_history?

11

Как я могу изменить содержимое моего bash_historyфайла? Какие значения или переменные контролируют, как долго длится история? Есть ли другие вещи, которые я могу изменить, чтобы лучше контролировать мою историю BASH?

nbro
источник
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является сокращением для ignorespace и ignoredups.

  • HISTTIMEFORMAT: Это позволяет вам установить формат времени файла истории. Смотрите ответ Панди или читайте man bashдля подробностей.


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

  • Вариант histappendbash. Это можно установить, запустив 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, увеличивая тем самым срок службы его содержимого.

Citylight
источник
2
примечание: если вы повышаете HISTSIZEлимит, подумайте и об изменении HISTFILE. Если вы запустите bash --norc HISTSIZE, вернетесь к значению по умолчанию, обрезая его HISTFILEпри выходе.
Луа
Спасибо, @llua. Точно так же, если ваша система /etc/bash.bashrcустанавливает HISTFILESIZE(или, может быть HISTSIZE, я не проверял, какой), то Bash, по-видимому, усекается .bash_historyв точке, которую она читает /etc/bash.bashrc(или, по крайней мере, в какой-то момент до того, как ваш новый лимит установлен в ваших собственных файлах Bash init). Чтобы избежать этого, снова установите свой собственный, HISTFILEчтобы ваша реальная история шла туда, а не в .bash_historyфайл, который Bash усекает.
Крис Повирк
(Но не делайте exportэтого, так как это сделало бы его видимым для любых дочерних оболочек, которые могли бы вместо этого усекать его .bash_history!)
Крис Повирк
0

Прочитайте man bashподробности об истории bash, например:

HISTCONTROL
       Список значений, разделенных двоеточиями, управляющий тем, как команды сохраняются в списке истории.
       Если список значений включает в себя игнорируемое пространство, строки, начинающиеся с пробела
       не сохраняется в списке истории. Значение ignoredups вызывает строки, соответствующие предыдущему
       запись истории не будет сохранена. Значение ignoreboth является сокращением для ignorespace и
       ignoredups. Значение erasedups приводит к тому, что все предыдущие строки, соответствующие текущей строке,
       быть удален из списка истории, прежде чем эта строка будет сохранена. Любое значение, не указанное выше
       список игнорируется. Если HISTCONTROL не установлен или не содержит допустимого значения, все строки
       прочитанные парсером оболочки сохраняются в списке истории, в зависимости от значения HISTIG-
       NORE. Вторая и последующие строки многострочной составной команды не проверяются,
       и добавляются в историю независимо от значения HISTCONTROL.
HISTFILE
       Имя файла, в котором сохраняется история команд (см. ИСТОРИЯ ниже). По умолчанию
       значение ~ / .bash_history. Если не установлено, история команд не сохраняется при выходе из оболочки.
HISTFILESIZE
       Максимальное количество строк, содержащихся в файле истории. Когда эта переменная назначена
       значение, файл истории усекается, если необходимо, чтобы содержать не более этого числа
       строк, удалив самые старые записи. Файл истории также усекается до этого размера
       после записи, когда оболочка выходит. Если значение равно 0, файл истории усекается до
       нулевой размер. Нечисловые значения и числовые значения меньше нуля препятствуют усечению. 
       Оболочка устанавливает значение по умолчанию в значение HISTSIZE после чтения любых файлов запуска.
HISTIGNORE
       Список шаблонов, разделенных двоеточиями, используемый для определения, какие командные строки следует сохранять
       список истории. Каждый шаблон привязан в начале строки и должен соответствовать
       полная строка (не добавляется неявный `* '). Каждый шаблон проверяется на соответствие линии
       после проверки, указанной HISTCONTROL. В дополнение к нормальной оболочке
       символы, соответствующие шаблону, `& 'соответствует предыдущей строке истории. `& 'можно избежать
       использование обратной косой черты; обратная косая черта удаляется перед попыткой совпадения. Второй и
       последующие строки многострочной составной команды не проверяются и добавляются в
       история независимо от значения HISTIGNORE.
HISTSIZE
       Количество команд, которые нужно запомнить в истории команд (см. ИСТОРИЯ ниже). Если
       значение равно 0, команды не сохраняются в списке истории. Числовые значения меньше нуля
       в результате каждая команда будет сохранена в списке истории (ограничений нет). Оболочка
       устанавливает значение по умолчанию 500 после чтения любых файлов запуска.
HISTTIMEFORMAT
       Если эта переменная установлена ​​и не равна нулю, ее значение используется в качестве строки формата для strftime (3)
       распечатать метку времени, связанную с каждой записью истории, отображаемой в истории
       встроенный. Если эта переменная установлена, метки времени записываются в файл истории, поэтому они могут
       быть сохраненным через сеансы оболочки. Это использует символ комментария истории, чтобы отличить
       Guish метки времени от других линий истории.

В частности, HISTFILESIZEи, HISTSIZEвозможно, вы ищете и помогает вам.

Pandya
источник