Problemstellung
Ich habe zahlreiche Beispiele für kreative Dinge mit der Bash-Historie verfolgt, etwa wie folgt:
# simplified example
PROMPT_COMMAND='history -a; history -c; history -r'
... aber es schien zeitweise zu funktionieren. Wenn die Verlaufsdatei mit dem vorherigen Verlauf bereits vorhanden ist, ist alles in Ordnung.
Weitere relevante Informationen
- Bash-Versionen: 3.2.51, 4.1.2 und 4.2.45
- 4.2.x scheint dieses Problem nicht zu haben, aber es ist eine nicht standardmäßige Installation
- Betriebssystem: Linux und Solaris
- Das Home-Verzeichnis ist über NFS eingebunden
Diagnoseschritte
Ich habe meins entfernt .bashrc
und meins .bash_profile
auf Folgendes gesetzt:
HISTFILE=$HOME/.bash_history.test
Ich würde dann eine Login-Shell starten (z. B. per SSH auf einen anderen Rechner) und etwa Folgendes tun:
~ cat .bash_history.test
cat: .bash_history.test: No such file or directory
~ history
1 cat .bash_history.test
2 history
~ history -a
~ !-3
cat .bash_history.test
cat: .bash_history.test: No such file or directory
history -a
Unter den folgenden Umständen wird die Verlaufsdatei nicht angehängt :
- Die Datei existiert noch nicht
- Die Datei ist leer oder enthält nur Zeilenumbrüche; auch Leerzeichen können verwendet werden.
... wenn die Shell sie jedoch verlässttuterstellen. Danach history -a
funktioniert es wie erwartet ... außer wenn PROMPT_COMMAND="history -a; history -c; history -r"
. Als ich das eingestellt hatte, wurde die Verlaufsdatei nicht einmal beim Beenden der Shell erstellt (es sei denn, ich habe es exec bash
zuerst ausgeführt).
Ich habe es dann mit einer nicht standardmäßigen Installation von Bash (4.2.x) versucht und das Problem ist nicht aufgetreten.
Antwort1
Dieser Mailinglisten-Threadscheint diese Probleme zu erklären; Zitat aus der zweiten Nachricht:
Der aktuelle Code in bashhist.c:maybe_append_history() (der seit mindestens 15 Jahren existiert) scheint den Fall nicht zu behandeln, in dem die Anzahl der Verlaufszeilen in der aktuellen Sitzung gleich der Anzahl der Einträge in der Verlaufsliste ist. Das heißt, der Code fügt keine neuen Zeilen an, wenn er davon ausgeht, dass beim Starten der Shell keine Zeilen aus der Verlaufsdatei gelesen wurden. Das scheint falsch zu sein, und ich habe einen Patch angehängt, der das Problem behebt. Der Code existiert jedoch schon so lange in seiner aktuellen Form, dass ich mich frage, ob es dafür einen anderen Grund gibt.
(Chet Ramey, GNU-Bash-Mailingliste)
Darüber hinausÄnderungsprotokollzu 4.2 lautet der Text:
+ 8/13
+ ----
+bashhist.c
+ - in maybe_append_history, change check for history_lines_this_session
+ so that we append the lines to the file if it's equal to the value
+ returned by where_history(). This means that without this change,
+ the history won't be appended if all the lines in the history list
+ were added in the current session since the last time the history
+ file was read or written. Fixes bug reported by Bruce Korb
+ <[email protected]>
(git.savannah.gnu.org, bash git repo)
Um dieses Problem zu beheben, müssen wir offensichtlich eine neuere Version von Bash installieren.
Hoffentlich hilft das später jemand anderem.