Lösung 1:
Um das Verhalten des Bash-Verlaufs zu verstehen, müssen Sie zunächst Folgendes wissen:
- Da ist der Verlauf in der Verlaufsdatei.
- Da ist die Geschichte im Speicher eines Bash-Prozesses.
- Der Verlauf im Speicher eines Bash-Prozesses wird nicht mit dem Verlauf im Speicher eines anderen Bash-Prozesses synchronisiert.
- Der Verlauf im Speicher eines Bash-Prozesses wird nicht mit dem Verlauf in der Datei synchronisiert, es sei denn, Sie werden ausdrücklich darum gebeten oder während eines bestimmten Ereignisses (siehe unten).
Unter Verwendung der Standardeinstellungen sieht der Lebenszyklus einer Bash-Sitzung in Bezug auf die Historie wie folgt aus:
- Während des Starts liest bash die Verlaufsdatei. Der Inhalt der History-Datei befindet sich nun im Speicher des Bash-Prozesses.
- Während der normalen Verwendung wird nur der Verlauf im Speicher manipuliert.
- Während des Herunterfahrens wird der Verlauf im Speicher in die Verlaufsdatei geschrieben, wobei alle vorherigen Inhalte der Verlaufsdatei überschrieben werden.
Das scheinbar nicht deterministische Verhalten, das Sie beobachtet haben, liegt hauptsächlich daran, dass der Inhalt der Verlaufsdatei immer der Verlauf der letzten geschlossenen Bash-Sitzung ist und Bash die Verlaufsdatei nur während des Starts liest.
Lesen Sie das Bash-Handbuch für eine detailliertere Erklärung des Start- und Herunterfahrvorgangs.
Beachten Sie, dass ich mit Standardeinstellungen die Standardeinstellungen von bash meine. Ihre Distribution hat möglicherweise einen .bashrc
bereitgestellt (oder /etc/bash.bashrc
), die dieses Verhalten ändern.
Durch Aktivieren der Shell-Option histappend
Sie können bash anweisen, anzuhängen, anstatt die Verlaufsdatei zu überschreiben. Sie können histappend
aktivieren mit dem Befehl shopt -s histappend
. Um diese Option immer aktiviert zu haben, müssen Sie den Befehl in Ihren .bashrc
einfügen (oder eine andere Initialisierungsdatei). Lesen Sie mehr über shopt
Befehl im Bash-Handbuch
Beachten Sie, dass Sie histappend
aktivieren wird das scheinbar nicht deterministische Verhalten nicht wesentlich reduzieren. Dies liegt daran, dass jede Bash-Session immer noch ihre eigene Geschichte im Speicher hat. Es ist möglich, einen größtenteils synchronisierten Bash-Verlauf zu haben. Es gibt eine Anleitung, wie man jeden Bash-Prozess dazu bringt, einen größtenteils synchronisierten Verlauf in einem Thread bei Stapelüberlauf zu haben.
mit dem eingebauten Befehl history
Sie können bash explizit anweisen, den Verlauf von der Datei in den Speicher zu lesen oder vom Speicher in die Datei zu schreiben. Beispiel:history -r
liest den Inhalt der Datei und hängt ihn an den Verlauf im Speicher an. history -w
schreibt den aktuellen Verlauf aus dem Speicher in eine Datei und überschreibt den vorherigen Inhalt. Dies ist im Grunde das, was während des Herunterfahrens passiert. Lesen Sie mehr über history
Befehl im Bash-Handbuch
Der Vollständigkeit halber hier eine Liste der internen Variablen, die das Verlaufsverhalten modifizieren:
HISTFILE
:Die Datei, aus der gelesen und in die der Verlauf geschrieben werden soll.HISTFILESIZE
:die maximale Zeilenanzahl für die Verlaufsdatei.HISTSIZE
:die maximale Zeilenanzahl für den Verlauf im Speicher.HISTCONTROL
,HISTIGNORE
,HISTTIMEFORMAT
:nicht relevant für diese Diskussion. Lesen Sie das Bash-Handbuch für Details.
Lösung 2:
http://www.gnu.org/software/bash/manual/bashref.html#Using-History-Interactively
Möglicherweise können Sie mit einem der Terminals manipulieren, wie in die Verlaufsdatei geschrieben wird, dh führen Sie "history -a" oder "history -w" in dem Terminal aus, in dem Sie den Verlauf speichern möchten, und dann "history -r". die anderen Endgeräte. Hängt davon ab, was Sie tun möchten.