Warum scheinen in der Standard-Bash einige der Befehle, die ich in der Vergangenheit verwendet habe, nicht vorhanden zu sein, andere jedoch schon?

Warum scheinen in der Standard-Bash einige der Befehle, die ich in der Vergangenheit verwendet habe, nicht vorhanden zu sein, andere jedoch schon?

Auf einem Mac: Sierra.

Ich kann keine HISTentsprechenden Einstellungen sehen:

~ @ Magni (jcollum) 
$ env|grep HIST

~ @ Magni (jcollum) 
$ cat ~/.bash_profile | grep HIST

~ @ Magni (jcollum) 

Aber ich habe Dinge in meinem Verlauf, die ich gestern gemacht habe und die nach einem Neustart nicht mehr da sind. Ich bezweifle wirklich, dass ich jedes Mal, wenn ich es gemacht habe, Leerzeichen vor den Befehl gesetzt habe.

Ich weiß, dass es hier Beiträge gibt, die mir sagen, wie ich das Problem beheben kann, aber ich würde gerne wissenWarumes passiert so.

Wenn ich beispielsweise nach einem suche, curldas ich gestern ausgeführt habe, passiert nichts:

~ @ Magni (jcollum) 
$ history | grep curl 
166  curl -X POST -d [email protected] -d password=********** http://localhost:3000/login
503  hg curl 
519  history | grep curl 

Vor 400 Befehlen? Ich weiß, dass ich es in der letzten Woche ein Dutzend Mal verwendet habe curl, aber (und ich verwende Bash nicht oft genug, um diese Woche Hunderte von Befehlen ausgeführt zu haben).

Im Grunde bin ich einfach nur ratlos und weiß nicht, warum so viel von dem, was ich getan habe, fehlt. Ist es möglich, dass der Verlauf nur von einer Bash-Instanz aufgezeichnet wird?

Antwort1

Ist es möglich, dass der Verlauf nur von einer Bash-Instanz aufgezeichnet wird?

So ungefähr läuft es. Die Art und Weise, wie der Verlauf in Bash funktioniert, sofern Sie nichts unternommen haben, um ihn zu ändern, ist:

  • Beim Start von Bash wird der gespeicherte Verlauf aus der Verlaufsdatei geladen.
  • Jedes Mal, wenn ein Befehl ausgeführt wird, wird er dem Verlauf im Speicher der Bash hinzugefügt.
  • Wenn Bash beendet wird, speichert es den gesammelten Verlauf in der Verlaufsdatei.

Nehmen wir nun an, Sie starten zwei Instanzen von Bash. Beide laden die Verlaufsdatei, wenn sie starten. Beide fügen die Befehle, die sie ausführen, zu ihrem eigenen Verlauf hinzu. Wenn eine Instanz beendet wird, speichert sie den alten Verlauf sowie ihre eigenen Befehle in der Verlaufsdatei. Wenn die zweite Instanz beendet wird, speichert sie den alten Verlauf sowiees isteigenen Befehl an die Verlaufsdatei an – und löscht dabei den Verlauf der ersten Instanz, die beendet wurde.

Der Mechanismus zum Speichern des Verlaufs in Bash ist zu simpel. Ihre Verlaufszeilen sind jeder anderen laufenden Instanz ausgeliefert – diejenige, die zuletzt beendet wird, löscht den Verlauf der anderen. Lösungen sind das Anhängen des neuen Verlaufs an die Verlaufsdatei, anstatt die Verlaufsdatei mit dem gesamten Verlauf im Arbeitsspeicher zu überschreiben, oder das Anhängen von Zeilen an die Verlaufsdatei, sobald sie ausgeführt werden. SieheBewahren Sie den Bash-Verlauf in mehreren Terminalfenstern aufUndBewahren Sie den Bash-Verlauf in mehreren Terminalfenstern auffür einige Möglichkeiten zur Implementierung dieser und anderer Varianten.

Die einfachste Lösung besteht darin, zsh auszuführen, das den Verlauf standardmäßig auf vernünftige Weise speichert. Ich empfehle dies, insbesondere wenn Sie macOS verwenden, das auf einer alten Bash-Version festhängt, weil Apple die Lizenz der seit 2009 veröffentlichten Versionen nicht mag.

verwandte Informationen