Потеря истории Bash при использовании histappend

18

Мне нравится хранить много истории, поэтому я histappendустановил в моем .bashrc. В большинстве случаев все работает нормально, история складывается из множества добавляемых оболочек. Тем не менее, время от времени я запускаю новую оболочку и обнаруживаю, что потерял всю историю - и она часто содержит только некоторые команды из последней оболочки для выхода (т.е. это не просто перезапись вместо добавления ), Из-за этого я подозреваю, что это происходит при выходе из оболочки, а не из-за какого-то другого процесса, убивающего .bash_historyфайл. В поддержку этого вывода у меня в командной строке есть номера команд истории, и я никогда не видел, чтобы они прыгали вниз.

Кто-нибудь когда-нибудь сталкивался с подобной проблемой? Или даже просто есть предложения, как отследить проблему?

Cascabel
источник

Ответы:

13

Извините, что отвечаю на мой вопрос, но ни один из других ответов на самом деле не решает проблему.

Я наконец-то понял, что это происходит только при закрытии gnome-terminalсамого себя (т.е. file> exit, кнопка 'x', alt + F4) и даже тогда, как правило, только при закрытии нескольких терминалов в быстрой последовательности. Это никогда не происходит при использовании ctrl-D для закрытия оболочки, позволяя терминалу следовать.

Если мне удастся это исправить, я отправлю отчет об ошибке в gnome-терминале. А пока, возможно, это поможет другим людям, которые попали сюда из Google!

Cascabel
источник
10

Не знаю, почему это происходит, но, возможно, вы можете обойти проблему, заставив bash записывать в свой файл истории каждый раз, когда он отображает приглашение:

PROMPT_COMMAND="history -a; history -n"

Это будет записывать (-a) и затем перечитывать (-n) файл истории каждый раз, когда bash запрашивает следующую команду. Дополнительное преимущество: вы получите команду X в оболочке 1 в истории оболочки 2.

InnaM
источник
Не работает на GNU bash, выпуск 3.00.15 (1) -релиз (i686-redhat-linux-gnu)
Дэвид Макинтош
2
Можете ли вы объяснить, что означает "не работает"?
InnaM
3
Дополнительное преимущество, на которое вы ссылаетесь, во многих случаях является недостатком. Это не то поведение, которое я ищу, потому что я, возможно, выполняю две совершенно разные задачи в разных оболочках и не хочу смешивать их историю. Это также, вероятно, ничего не поможет. Когда история исчезает, она удаляет содержимое .bash_history - я не думаю, что будет иметь значение, были ли они написаны на выходе из оболочки или PROMPT_COMMAND.
Каскабель
5
history -nоблупленный Это надежнее сделать history -a; history -c; history -r. Чтобы объяснить это, я сначала отмечу, что history -aэто правильно: ваша команда .bash_historyбудет содержать все введенные вами команды в том порядке, в котором вы их вводили, при условии, что вы запускаете history -aпосле каждой команды. Задача состоит в том, чтобы синхронизировать представление оболочки об истории с файлом .bash_history. Это легко, -cи -rпроблема в том, что он может быть медленным, если он большой. -nможет сломаться, потому что он неправильно определяет, какие строки являются новыми. (У меня здесь
мало
4
(... если вы используете -n) Представьте , что вы выполняете команду в оболочке 1: ls. Затем в другой оболочке, Shell Two, вы выполняете cd. Теперь история в .bash_history верна, потому что history -aв вашем PROMPT_COMMAND- она ​​будет содержаться ls \n cd \n. Далее вы вернетесь в Shell One и наберете pwd. Shell One считает, что в истории была только команда n ( ls). Теперь он думает, что есть две команды ( lsи pwd) в истории. Когда вы делаете -nэто, он думает (у меня есть две команды в моей истории, и в .bash_history есть две команды, поэтому я в курсе
событий
3

По моему опыту, оболочки обновляли файл истории во время выхода. Таким образом, первоначальная «история» оболочки зависела от самого последнего взгляда на историю оболочки.

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

Дэвид Макинтош
источник
2
Я очень хорошо понимаю, как пишется файл истории - вот почему я указал в своем вопросе, который я использую histappend. Проблема не в неожиданном контенте, а в полной потере ранее сохраненного контента.
Каскабель
Это объясняет, почему я терял свою историю ...
B 7
1

Я видел это раньше, но это была проблема с ошибками диска, которые происходили все чаще. Я бы запустил сканирование на диске. Если окажется, что с диском все в порядке, я бы проверил, не превышает ли этот файл произвольный предел истории оболочки.

Что-то, что могло бы предотвратить это, состояло бы в том, чтобы продолжать сокращать файл до 80 строк или скольких команд вы хотите, чтобы история была.

Axxmasterr
источник
У меня нет root-прав на машине, на которой это происходит, но я вполне уверен, что диск в порядке. Мой домашний каталог хранится на сервере в нашей лаборатории (я полагаю, достаточно RAID) и смонтирован на nfs. Что вы подразумеваете под «произвольным пределом истории оболочки»? Все это происходит намного ниже HISTSIZE и HISTFILESIZE, и хотя я и установил большое значение, они намного ниже intbash и хранят их как.
Каскабель
Я должен сказать, что вступление Дэвида Макинтоша, вероятно, происходит.
Axxmasterr
1
Я полностью уверен, что это не так. Я никогда не должен был заканчиваться только двумя командами в моей истории, когда последняя оболочка для выхода имела пару дюжин команд, файл истории имел несколько сотен, а HISTSIZE / HISTFILESIZE установлены на 10000.
Cascabel