bash: history - schreibt nicht, es sei denn, HISTFILE enthält bereits Text

1

Problemstellung

Ich habe zahlreiche Beispiele für kreative Dinge mit Bash-Geschichte nach folgenden Gesichtspunkten verfolgt:

# simplified example
PROMPT_COMMAND='history -a; history -c; history -r'

... aber es schien zeitweise zu funktionieren. Wenn die Verlaufsdatei bereits mit dem vorherigen Verlauf vorhanden ist, ist alles in Ordnung.

Andere relevante Informationen

  • Bash-Versionen: 3.2.51, 4.1.2 und 4.2.45
    • 4.2.x scheint dieses Problem nicht zu haben, es handelt sich jedoch um eine nicht standardmäßige Installation
  • Betriebssystem: Linux & amp; Solaris
  • Ausgangsverzeichnis ist NFS-gemountet

Diagnoseschritte

Ich habe meine los .bashrc &Ampere; setze meine .bash_profile zu:

HISTFILE=$HOME/.bash_history.test

Ich würde dann eine Login-Shell starten (zB ssh zu einem anderen Rechner) & amp; mach so etwas wie das folgende:

~ 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

Die Verlaufsdatei wird nicht von angehängt history -a unter folgenden Umständen:

  • Die Datei existiert noch nicht
  • Die Datei ist leer oder enthält nur Zeilenumbrüche. Sogar mit Leerzeichen wird es funktionieren

... jedoch, wenn die Shell es verlässt tut erstelle es. Danach, history -a funktioniert wie erwartet ... außer wenn PROMPT_COMMAND="history -a; history -c; history -r". Als ich diesen Satz hatte, erzeugte nicht einmal das Verlassen der Shell die Verlaufsdatei (es sei denn, ich lief exec bash zuerst).

Ich habe es dann mit einer nicht standardmäßigen Installation von bash (4.2.x) versucht und das Problem trat nicht auf.

Brian Vandenberg
quelle

Antworten:

1

Dieser Mailinglisten-Thread scheint diese Probleme zu erklären; Zitat aus der 2. Msg:

Der aktuelle Code in bashhist.c: maybe_append_history () (der hat   existiert seit mindestens 15 Jahren) scheint den Fall nicht zu behandeln, in dem die   Die Anzahl der Verlaufszeilen in der aktuellen Sitzung entspricht der Anzahl   von Verlaufslisteneinträgen. Das heißt, der Code fügt keine neuen Zeilen hinzu, wenn   Es wird nicht angenommen, dass beim Lesen der Verlaufsdatei Zeilen vorhanden waren   Die Muschel begann. Das scheint falsch und ich habe einen Patch angehängt   behebt es. Dafür existiert der Code jedoch in seiner aktuellen Form   lange, dass ich mich frage, ob es einen anderen Grund dafür gibt oder nicht   es.

(Chet Ramey, GNU-Bash-Mailingliste)

Darüber hinaus ist die Änderungsprotokoll für 4.2 hat den folgenden 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)

Offensichtlich müssen wir eine neuere Version von Bash installieren, um dieses Problem zu beheben.

Hoffentlich hilft das jemand anderem auf dem Weg.

Brian Vandenberg
quelle