Verlust des Bash-Verlaufs bei Verwendung von histappend

6754
Cascabel

Ich mag es, sehr viel Geschichte zu behalten, also habe ich mich histappendin meiner .bashrc. Die meiste Zeit funktioniert alles gut, wobei die Geschichte aus vielen Muscheln besteht. Hin und wieder starte ich jedoch eine neue Shell und stelle fest, dass ich die gesamte Historie verloren habe - und sie enthält oft nur einige der Befehle von der letzten Shell zum Beenden (dh sie überschreiben nicht nur das Anhängen ). Aus diesem Grund bin ich misstrauisch beim Shell-Exit und nicht bei einem anderen Prozess, bei dem die .bash_historyDatei abgebrochen wird. Um diese Schlussfolgerung zu unterstützen, habe ich in meiner Eingabeaufforderung historische Befehlsnummern, und ich habe noch nie einen Sprung nach unten gesehen.

Hat jemand jemals ein ähnliches Problem? Oder haben Sie einfach nur Vorschläge, wie Sie das Problem aufspüren können?

15
Siehe: [patch # 8676: Korrigiert das Abschneiden von .bash_history] (https://savannah.gnu.org/patch/index.php?8676). kenorb vor 9 Jahren 1

4 Antworten auf die Frage

12
Cascabel

Es tut mir leid, meine eigene Frage zu beantworten, aber keine der anderen Antworten spricht wirklich das Problem an.

Ich habe endlich herausgefunden, dass dies nur beim Schließen geschieht gnome-terminal(dh Datei> Beenden, die Taste "x", Alt + F4) und sogar dann, wenn mehrere Terminals in schneller Folge geschlossen werden. Es passiert nie, wenn Sie die Shell mit Strg-D schließen und das Terminal folgen lassen.

Wenn ich es gut genug festlegen kann, werde ich einen Gnome-Terminal-Fehlerbericht einreichen. In der Zwischenzeit hilft das vielleicht einigen anderen Leuten, die von google hierher kommen!

9
innaM

Keine Ahnung, warum dies der Fall ist, aber möglicherweise können Sie das Problem umgehen, indem Sie erzwingen, dass bash jedes Mal in seine Protokolldatei schreibt, wenn eine Eingabeaufforderung angezeigt wird:

PROMPT_COMMAND="history -a; history -n" 

Dadurch wird die History-Datei jedes Mal geschrieben (-a) und dann erneut gelesen (-n), wenn bash zum nächsten Befehl auffordert. Zusätzlicher Vorteil: Sie erhalten den Befehl X in Shell 1 in der Historie von Shell 2.

Funktioniert nicht mit GNU bash, Version 3.00.15 (1) -release (i686-redhat-linux-gnu) David Mackintosh vor 15 Jahren 0
Kannst du erklären, was "nicht funktioniert" bedeutet? innaM vor 15 Jahren 2
Der von Ihnen genannte Zusatznutzen ist in vielen Fällen ein Nachteil. Es ist nicht das Verhalten, nach dem ich suche, da ich vielleicht zwei völlig getrennte Aufgaben in separaten Hüllen erledige und ihre Geschichte nicht vermischen möchte. Das würde wahrscheinlich auch nichts helfen. Wenn der Verlauf verschwindet, wird der Inhalt von .bash_history gelöscht. Ich gehe nicht davon aus, ob er beim Shell-Exit oder von PROMPT_COMMAND geschrieben wurde. Cascabel vor 15 Jahren 3
Sicher. Wenn ich Shell A und Shell B starte, dann "Echo Bookie" in Shell A eingeben, wird dieser Befehl nicht in die Historie von Shell B übernommen. David Mackintosh vor 15 Jahren 0
Richtig, aber wenn Sie jemals eine Reihe von Befehlen ausführen möchten - in Shell C, die nach A und B gestartet wurde, oder Sie vielleicht feststellen, dass Sie es in ein Skript verwandeln möchten, wurde es gemischt. Cascabel vor 15 Jahren 0
`history -n` ist flockig. Es ist zuverlässiger, "Geschichte -a" zu tun; Geschichte -c; Geschichte -r`. Um dies zu erklären, stelle ich zunächst fest, dass "history -a" das Richtige tut - Ihr ".bash_history" enthält alle Befehle, die Sie eingegeben haben, in der Reihenfolge, in der Sie sie eingegeben haben - vorausgesetzt, Sie führen "history -a" aus nach jedem Befehl. Die Herausforderung besteht darin, die historische Vorstellung der Shell mit der Datei .bash_history zu synchronisieren. Dies ist mit `-c` und` -r` einfach. Das Problem ist, dass es langsam sein kann, wenn es groß ist. `-n` kann brechen, weil es falsch identifiziert, welche Zeilen neu sind. (Ich habe keinen Platz mehr hier!) Aaron McDaid vor 11 Jahren 3
(... wenn Sie `-n` verwenden.) Stellen Sie sich vor, Sie führen einen Befehl in Shell 1 aus:` ls`. Dann führen Sie in einer anderen Shell, Shell Two, `cd` aus. Nun ist die Historie in der .bash_history aufgrund des `history -a` in Ihrem` PROMPT_COMMAND` korrekt - sie enthält `ls \ n cd \ n`. Als nächstes kehren Sie zu Shell One zurück und geben "pwd" ein. Shell One * glaubt *, dass es nur einen Befehl in der Historie gab (`ls`). Jetzt glaubt es, dass es zwei Befehle (`ls` und` pwd`) in der Geschichte gibt. Wenn Sie `-n` machen, denkt es (ich habe zwei Befehle in meiner Geschichte, und es gibt zwei Befehle in .bash_history, daher bin ich auf dem neuesten Stand.) Aaron McDaid vor 11 Jahren 2
Diese Antwort funktioniert auch nicht für mich (in gnome-terminal auf Ubuntu 12.10), aber die Modifikation von Aaron funktioniert irgendwie (es scheint einen Befehl später zu aktualisieren) wim vor 11 Jahren 0
3
David Mackintosh

Meine Erfahrung war, dass Shells die History-Datei beim Beenden aktualisiert hat. Die ursprüngliche "Historie" einer Shell hing also von der Ansicht der zuletzt verlassenen Shell in der Historie ab.

Das Ergebnis davon ist, dass Sie Befehle erhalten können, die aus der Historie kommen und gehen, je nachdem, wie andere Shells gestartet und gestoppt wurden.

Ich verstehe sehr gut, wie die History-Datei geschrieben wird - deshalb habe ich in meiner Frage angegeben, dass ich "histappend" verwende. Das Problem ist kein unerwarteter Inhalt, sondern ein vollständiger Verlust von zuvor gespeichertem Inhalt. Cascabel vor 15 Jahren 2
Dies erklärt, warum ich meine Geschichte verlor ... B Seven vor 12 Jahren 0
1
Axxmasterr

Ich habe dies bereits zuvor gesehen, aber es war ein Problem mit Festplattenfehlern, die immer häufiger auftraten. Ich würde einen Scan auf der Festplatte ausführen. Wenn sich herausstellt, dass das Laufwerk in Ordnung ist, würde ich prüfen, ob diese Datei ein beliebiges Shell-Verlaufslimit nicht überschreitet.

Etwas, das dies verhindern kann, wäre, die Datei immer wieder auf 80 Zeilen zurückzuschneiden oder wie viele Befehle der Verlauf sein soll.

Ich habe keinen Root-Zugriff auf dem Computer, auf dem dies geschieht, aber ich bin ziemlich zuversichtlich, dass das Laufwerk in Ordnung ist. Mein Heimatverzeichnis ist auf einem Server in unserem Labor gespeichert (viel RAID, glaube ich) und über NFS gemountet. Was meinst du mit "willkürliches Shell History Limit"? Dies geschieht alles gut unter HISTSIZE und HISTFILESIZE, und obwohl ich beide groß eingestellt habe, liegen sie weit unter dem `int`-Archiv, in dem sie gespeichert werden. Cascabel vor 15 Jahren 0
Ich muss sagen, dass David Mackintoshs Eintrag wahrscheinlich das ist, was gerade passiert. Axxmasterr vor 15 Jahren 0
Ich bin mir ganz sicher, dass es nicht so ist. Ich sollte nie mit nur zwei Befehlen in meiner Historie enden, als die letzte Shell, die beendet wurde, ein paar Dutzend Befehle hatte, die History-Datei mehrere Hundert hatte und HISTSIZE / HISTFILESIZE auf 10000 gesetzt sind. Cascabel vor 15 Jahren 1