Ich mag es, eine Menge Geschichte zu führen, also habe ich mich histappend
in meine gesetzt .bashrc
. Meistens funktioniert alles einwandfrei, und die Geschichte besteht aus vielen anhängenden Muscheln. Hin und wieder starte ich jedoch eine neue Shell und stelle fest, dass ich den gesamten Verlauf verloren habe - und sie enthält oft nur einige der Befehle, die von der letzten Shell bis zum Beenden ausgeführt wurden (dh, sie wird nicht einfach überschrieben, sondern angehängt) ). Aus diesem Grund bin ich misstrauisch, dass es beim Beenden der Shell passiert und nicht aufgrund eines anderen Prozesses, der die .bash_history
Datei beendet. Aus diesem Grund habe ich in meiner Eingabeaufforderung Verlaufsbefehlsnummern, und ich habe nie gesehen, wie sie absprangen.
Jemand jemals auf ein ähnliches Problem gestoßen? Oder haben Sie einfach Vorschläge, wie Sie das Problem aufspüren können?
Antworten:
Es tut mir leid, meine eigene Frage zu beantworten, aber keine der anderen Antworten spricht das Problem wirklich an.
Ich habe endlich herausgefunden, dass dies nur geschieht, wenn sich das Programm
gnome-terminal
selbst schließt (dh Datei> Beenden, die Taste 'x', Alt + F4), und auch dann im Allgemeinen nur, wenn mehrere Terminals schnell hintereinander geschlossen werden. Dies passiert nie, wenn Sie die Shell mit Strg-D schließen und das Terminal folgen lassen.Wenn ich es gut genug festhalten kann, werde ich einen Gnome-Terminal-Fehlerbericht einreichen. In der Zwischenzeit hilft das vielleicht einigen anderen Leuten, die von Google hierher kommen!
quelle
Keine Ahnung, warum dies passiert, aber vielleicht können Sie das Problem umgehen, indem Sie bash zwingen, jedes Mal, wenn eine Eingabeaufforderung angezeigt wird, in die Verlaufsdatei zu schreiben:
Dadurch wird die Verlaufsdatei jedes Mal geschrieben (-a) und erneut gelesen (-n), wenn Bash nach dem nächsten Befehl fragt. Zusätzlicher Vorteil: Sie erhalten den Befehl X in Shell 1 im Verlauf von Shell 2.
quelle
history -n
ist schuppig. Es ist zuverlässiger zu tunhistory -a; history -c; history -r
. Um dies zu erklären, stelle ich zunächst fest, dasshistory -a
dies das Richtige ist: Ihr.bash_history
Wille enthält alle von Ihnen eingegebenen Befehle in der Reihenfolge, in der Sie sie eingegeben haben, vorausgesetzt, dass Siehistory -a
nach jedem Befehl ausgeführt werden. Die Herausforderung besteht darin, den Verlauf der Shell mit der Datei .bash_history synchron zu halten. Dies ist einfach mit-c
und-r
das Problem ist, dass es langsam sein kann, wenn es groß ist.-n
kann brechen, weil es falsch identifiziert, welche Zeilen neu sind. (Mir geht hier der Platz aus!)-n
) Stellen Sie einen Befehl in Shell ausführen 1:ls
. Dann führen Sie in einer anderen Shell, Shell Two, auscd
. Nun ist der Verlauf in der .bash_history korrekt, dahistory -a
in IhrerPROMPT_COMMAND
- es wird enthaltenls \n cd \n
. Als nächstes kehren Sie zur Shell One zurück und geben einpwd
. Shell One glaubt, dass es nur Befehl in der history (ls
) gab. Jetzt glaubt es, dass es zwei Befehle (ls
undpwd
) in der Geschichte gibt. Wenn Sie es tun-n
, denkt (ich habe zwei Befehle in meiner Geschichte, und es gibt zwei Befehle in .bash_history, deshalb bin ich auf dem neuesten Stand.)Ich habe die Erfahrung gemacht, dass Shells die Verlaufsdatei beim Beenden aktualisiert haben. Die anfängliche "Geschichte" einer Shell hing also von der Ansicht der zuletzt verlassenen Shell über die Geschichte ab.
Das Ergebnis ist, dass Sie Befehle aus dem Verlauf abrufen können, abhängig davon, wie andere Shells gestartet und gestoppt wurden.
quelle
histappend
. Das Problem ist nicht unerwarteter Inhalt, sondern ein Totalverlust von zuvor gespeicherten Inhalten.Ich habe dies schon einmal gesehen, aber es war ein Problem mit Festplattenfehlern, die mit zunehmender Häufigkeit auftraten. Ich würde einen Scan auf dem Laufwerk ausführen. Wenn sich herausstellt, dass das Laufwerk in Ordnung ist, würde ich überprüfen, ob diese Datei ein beliebiges Shell-Verlaufslimit nicht überschreitet.
Dies könnte möglicherweise verhindern, indem Sie die Datei auf 80 Zeilen zurückschneiden oder auf die Anzahl der Befehle, die Sie für den Verlauf benötigen.
quelle
int
Bash-Speicher, in denen sie gespeichert sind .