Um das Verhalten des Bash-Verlaufs zu verstehen, müssen Sie zunächst Folgendes wissen:
- In der Verlaufsdatei befindet sich der Verlauf.
- Es gibt die Geschichte in der Erinnerung an einen Bash-Prozess.
- 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 zu oder während eines bestimmten Ereignisses aufgefordert (siehe unten).
Unter Verwendung der Standardeinstellungen sieht der Lebenszyklus einer Bash-Sitzung in Bezug auf den Verlauf wie folgt aus:
- Während des Startvorgangs liest bash die Verlaufsdatei. Der Inhalt der Verlaufsdatei befindet sich jetzt im Speicher des Bash-Prozesses.
- Während des normalen Gebrauchs wird nur der Verlauf im Speicher manipuliert.
- Während des Herunterfahrens wird der Verlauf im Speicher in die Verlaufsdatei geschrieben, wobei der vorherige Inhalt der Verlaufsdatei überschrieben wird.
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 beim Start liest.
Lesen Sie das Bash-Handbuch, um eine detailliertere Beschreibung des Startvorgangs und des Herunterfahrens zu erhalten.
Beachten Sie, dass ich mit Standardeinstellungen die Standardeinstellungen von Bash meine. Ihre Distribution hat möglicherweise ein .bashrc
(oder /etc/bash.bashrc
) bereitgestellt, das dieses Verhalten ändert.
Durch Aktivieren der Shell-Option histappend
können Sie festlegen, dass bash die Verlaufsdatei anfügt, anstatt sie zu überschreiben. Sie können histappend
mit dem Befehl aktivieren shopt -s histappend
. Damit diese Option immer aktiviert ist, müssen Sie den Befehl in Ihre .bashrc
(oder eine andere Initialisierungsdatei) einfügen. Weitere Informationen zum shopt
Befehl finden Sie im Bash-Handbuch
Beachten Sie, dass durch die Aktivierung histappend
das scheinbar nicht deterministische Verhalten nicht wesentlich verringert wird. Dies liegt daran, dass für jede Bash-Sitzung immer noch eine eigene Historie gespeichert ist. Es ist möglich, einen meist synchronisierten Bash-Verlauf zu haben. Es gibt eine Anleitung, wie jeder Bash-Prozess einen weitgehend synchronisierten Verlauf in einem Thread beim Stapelüberlauf erhält .
Mit dem eingebauten Befehl history
können Sie bash explizit anweisen , den Verlauf von einer 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 vom Speicher in die Datei und überschreibt den vorherigen Inhalt. Dies ist im Grunde, was beim Herunterfahren passiert. Weitere Informationen zum history
Befehl finden Sie im Bash-Handbuch
Der Vollständigkeit halber finden Sie hier eine Liste der internen Variablen, die das Verlaufsverhalten ändern:
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 für diese Diskussion relevant. Lesen Sie das Bash-Handbuch für Details.
.bashrc
Datei. Beachten Sie, dass Ihre Distribution möglicherweise einige Einstellungen in geändert hat/etc/bash.bashrc
. überprüfen Sie speziell für die Shell-Optionhistappend
.http://www.gnu.org/software/bash/manual/bashref.html#Using-History-Interactively
Möglicherweise können Sie mit einem der Terminals die Schreibweise der Verlaufsdatei ändern, dh "history -a" oder "history -w" in dem Terminal ausführen, in dem Sie den Verlauf speichern möchten, und dann "history -r" in die anderen Terminals. Kommt darauf an, was du machen willst.
quelle
AFAIK, die Bash-Befehle werden nach Beendigung der SSH-Sitzung gespeichert. Daher werden die Befehle nicht gespeichert, wenn eine Sitzung abnormal beendet wird (z. B. aufgrund eines Netzwerkfehlers). Ich spreche hier von SSH-Sitzungen. Die lokalen Terminals können einen ähnlichen Ansatz verwenden.
Wenn Sie mehrere Sitzungen gleichzeitig öffnen, werden die in einer Sitzung eingegebenen Befehle in der anderen Sitzung nicht angezeigt, solange beide aktiv sind. Diese Befehle werden jedoch angezeigt, wenn Sie die Sitzung beenden und erneut öffnen.
quelle