Мне нравится хранить много истории, поэтому я поставил histappendперед собой .bashrc. В большинстве случаев все работает хорошо, история складывается из множества добавляемых оболочек. Тем не менее, время от времени я запускаю новую оболочку и обнаруживаю, что потерял всю историю - и она часто содержит только некоторые команды из последней оболочки для выхода (т.е. это не просто перезапись вместо добавления ). Из-за этого я подозреваю, что это происходит при выходе из оболочки, а не из-за какого-то другого процесса, убивающего .bash_historyфайл. В поддержку этого вывода в моей подсказке есть номера команд истории, и я никогда не видел, чтобы они прыгали вниз.
Кто-нибудь когда-нибудь сталкивался с подобной проблемой? Или даже просто есть предложения, как отследить проблему?
Смотрите: [патч # 8676: исправлено усечение .bash_history] (https://savannah.gnu.org/patch/index.php?8676).
kenorb 9 лет назад
1
Извините, что отвечаю на мой вопрос, но ни один из других ответов на самом деле не решает проблему.
Я наконец-то понял, что это происходит только при закрытии 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