GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Seltsames Verhalten des Bash-Verlaufs beim Ausführen mehrerer Sitzungen

Lösung 1:

Um das Verhalten des Bash-Verlaufs zu verstehen, müssen Sie zunächst Folgendes wissen:

  1. Da ist der Verlauf in der Verlaufsdatei.
  2. Da ist die Geschichte im Speicher eines Bash-Prozesses.
  3. Der Verlauf im Speicher eines Bash-Prozesses wird nicht mit dem Verlauf im Speicher eines anderen Bash-Prozesses synchronisiert.
  4. 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:

  1. Während des Starts liest bash die Verlaufsdatei. Der Inhalt der History-Datei befindet sich nun im Speicher des Bash-Prozesses.
  2. Während der normalen Verwendung wird nur der Verlauf im Speicher manipuliert.
  3. 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.


Linux
  1. So löschen Sie den Bash-Verlauf unter Linux

  2. Analysieren des Bash-Verlaufs unter Linux

  3. Verhindern, dass ein Bash-Skript gleichzeitig ausgeführt wird

  4. Bash-Verlauf in mehreren Terminalfenstern beibehalten?

  5. Aktualisieren Sie den Bash-Verlauf auf anderen Terminals, wenn Sie ein Terminal verlassen?

Verlaufsbefehl in Linux (Bash-Verlauf)

Mehrere Terminal-Tabs öffnen und Befehl ausführen?

Automatische Bestätigung beim Ausführen von Bash-Skripten?

Wie behalte ich meinen Bash-Verlauf sitzungsübergreifend?

Gibt es eine Möglichkeit, Punktstriche beim Ausführen ausführbarer Skripts in Bash zu vermeiden?

Untersuchen mehrerer Ports beim Ausführen von NetCat (nc)