иногда команды истории не сохраняются в .bash_history

20

Вчера я выпустил много команд в своем CentOS 7. Но когда я хотел получить эти команды сегодня, я обнаружил, что никакой записи не было. Когда я открыл файл .bash_history, я все еще не мог найти команды, которые я дал вчера, но я нашел много старых команд несколько дней назад. Почему последние команды не были сохранены? Как я могу увеличить возможности истории?

Джек
источник
Иногда, когда терминал закрывается ненормально, история не сохраняется, это также случалось со мной, но я не знаю обстоятельств, которые вызывают это поведение
mazs

Ответы:

11

Наиболее вероятная причина того, что элементы истории не отображаются, заключается не в том, HISTFILEчтобы установить ничего или HISTSIZEноль, а в том, что вы дважды заходите на одну и ту же машину и выходите со вторым экземпляром bash (в котором вы сделали мало или ничего) после того, где ты много сделал По умолчанию Bash не объединяет истории, и второй выход Bash перезаписывает тот, .bash_historyкоторый был так хорошо обновлен первым выходом Bash.

Чтобы этого не произошло, вы можете добавить в файл истории вместо перезаписи, вы можете использовать параметр histappendоболочки:

Если включена опция оболочки histappend (см. Описание shopt в разделе «Команды SHELL BUILTIN» ниже), строки добавляются в файл истории, в противном случае файл истории перезаписывается.

Более подробная информация в этом ответе включает в себя, как использовать HISTSIZE, HISTFILESIZEи HISTCONTROLконтролировать размер, дубликаты и т. Д.

Энтон
источник
3

Для изменения истории использовать размер два BASH переменных HISTSIZE, HISTFILESIZE(обычно устанавливаются в .bashrc).

Описание со страницы руководства BASH:

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

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

В качестве примера у меня есть следующая настройка в моем .bashrcфайле:

# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)
HISTSIZE=1000
HISTFILESIZE=2000
coffeMug
источник
1

Я имел это случиться, но решение не было перечислено здесь. Причиной была просто проблема копирования + вставки. Я копировал команду из другого документа, и у меня было несколько лишних пробелов в буфере обмена. По какой-то причине это привело к тому, что Ubuntu не сохранил команду в файл истории.

введите описание изображения здесь

Приведенное выше изображение было командой, которая была у меня в буфере обмена в виде документов Google. Эта команда выполнялась, но была пропущена из моей истории. Я просто вернулся и выбрал команду без пробелов, а затем она появилась в истории Bash.

Tycon
источник
5
Один из вариантов истории - игнорировать (не сохранять) строки, начинающиеся с пробела. Обычно по умолчанию включено. Это можно изменить в вашем .bashrc.
Studog
1

Убедитесь, что для вашей HISTCONTROLпеременной среды не установлено значение ignorespaceили ignoreboth.

$ echo $HISTCONTROL
ignoredups  #this is ok

Вы можете изменить его, установив значение в вашем ~/.bash_profileили вашем ~/.profileфайле:

HISTCONTROL=ignoredups

С bashman-страницы:

HISTCONTROL

Список значений, разделенных двоеточиями, управляющий тем, как команды сохраняются в списке истории.

Если список значений включает в себя ignorespace, строки, начинающиеся с пробела, не сохраняются в списке истории.

Значение ignoredupsприводит к тому, что строки, соответствующие предыдущей записи истории, не будут сохранены.

Значение ignorebothявляется сокращением для ignorespaceи ignoredups.

Значение erasedupsвызывает удаление всех предыдущих строк, соответствующих текущей строке, из списка истории перед сохранением этой строки.

Любое значение, отсутствующее в приведенном выше списке, игнорируется.

Если значение HISTCONTROL не установлено или не содержит допустимого значения, все строки, считываемые анализатором оболочки, сохраняются в списке истории в зависимости от значения HISTIGNORE. Вторая и последующие строки многострочной составной команды не тестируются и добавляются в историю независимо от значения HISTCONTROL.

gawi
источник