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

6316
Cascabel

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

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

15
Смотрите: [патч # 8676: исправлено усечение .bash_history] (https://savannah.gnu.org/patch/index.php?8676). kenorb 9 лет назад 1

4 ответа на вопрос

12
Cascabel

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

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

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

9
innaM

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

PROMPT_COMMAND="history -a; history -n" 

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

Не работает на GNU bash, версия 3.00.15 (1) -релиз (i686-redhat-linux-gnu) David Mackintosh 15 лет назад 0
Можете ли вы объяснить, что означает "не работает"? innaM 15 лет назад 2
Дополнительное преимущество, на которое вы ссылаетесь, во многих случаях является недостатком. Это не то поведение, которое я ищу, потому что я могу выполнять две совершенно разные задачи в разных оболочках и не хочу смешивать их историю. Это также, вероятно, ничего не поможет. Когда история исчезает, она удаляет содержимое .bash_history - я не думаю, что будет иметь значение, были ли они написаны на выходе из оболочки или PROMPT_COMMAND. Cascabel 15 лет назад 3
Конечно. Если я запускаю оболочку A и оболочку B, то набираю «echo Bookie» в оболочке A, эта команда не попадает в историю оболочки B. David Mackintosh 15 лет назад 0
Правильно, но если вы когда-нибудь захотите повторно выполнить серию команд - в оболочке C, запущенной после A и B, или, возможно, вы поймете, что хотите превратить его в сценарий, - это было смешано. Cascabel 15 лет назад 0
`история-н` неестественна. Надежнее делать `history -a; история -c; история Чтобы объяснить это, я сначала отмечу, что `history -a` делает правильные вещи - ваш` .bash_history` будет содержать все введенные вами команды в том порядке, в котором вы их ввели - при условии, что вы запускаете `history -a `после каждой команды. Задача состоит в том, чтобы синхронизировать представление оболочки об истории с файлом .bash_history. Это легко с `-c` и` -r`, проблема в том, что он может быть медленным, если он большой. `-n` может сломаться, потому что неправильно определяет, какие строки новые. (У меня здесь мало места!) Aaron McDaid 11 лет назад 3
(... если вы используете `-n`) Представьте, что вы выполняете команду в оболочке 1:` ls`. Затем в другой оболочке, Shell Two, вы выполняете `cd`. Теперь история в .bash_history верна из-за `history -a` в вашем` PROMPT_COMMAND` - она ​​будет содержать `ls \ n cd \ n`. Затем вы возвращаетесь в оболочку Один и набираете `pwd`. Shell One * думает *, что в истории была только команда n (`ls`). Теперь он думает, что в истории есть две команды (`ls` и` pwd`). Когда вы делаете `-n`, он думает (у меня есть две команды в моей истории, и в .bash_history есть две команды, поэтому я в курсе.) Aaron McDaid 11 лет назад 2
Этот ответ также не работает для меня (в gnome-терминал на Ubuntu 12.10), но вроде как работает модификация Аарона (похоже, что нужно обновить 1 команду позже) wim 11 лет назад 0
3
David Mackintosh

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

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

Я очень хорошо понимаю, как пишется файл истории - вот почему я указал в своем вопросе, что я использую `histappend`. Проблема не в неожиданном контенте, а в полной потере ранее сохраненного контента. Cascabel 15 лет назад 2
Это объясняет, почему я терял свою историю ... B Seven 12 лет назад 0
1
Axxmasterr

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

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

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