Ich habe durchweg mehr als ein Terminal geöffnet. Irgendwo zwischen zwei und zehn, um verschiedene Dinge zu erledigen. Nehmen wir nun an, ich starte neu und öffne einen weiteren Terminalsatz. Manche erinnern sich an bestimmte Dinge, manche vergessen.
Ich möchte eine Geschichte, die:
- Erinnert sich an alles von jedem Terminal
- Ist sofort von jedem Terminal aus erreichbar (zB wenn ich
ls
in einem bin , auf ein anderes bereits laufendes Terminal umsteige und dann auf drücke, erscheintls
) - Vergisst den Befehl nicht, wenn vor dem Befehl Leerzeichen stehen.
Was kann ich tun, um die Bash-Funktion zu verbessern?
export PROMPT_COMMAND="history -a; $PROMPT_COMMAND"
. Vorhandene Shells fügen jeden Befehl zur Verlaufsdatei hinzu, damit neue Shells angezeigt werden, zeigen jedoch nur ihre eigenen Verläufe an.Antworten:
Fügen Sie ~ / .bashrc Folgendes hinzu
quelle
history -a
löst (...) das Löschen von Duplikaten gemäß dieser Antwort auf die Frage " Bash-Verlauf" nicht aus: Die Einstellungen "Ignoriert" und "Gelöscht" stehen in Konflikt mit dem gemeinsamen Verlauf zwischen Sitzungen . Diese Antwort gibt auch die Befehlssequenz anhistory -<option>
, die mitHISTCONTROL=ignoredups:erasedups
setting funktioniert .export
die VariablenHISTCONTROL
undPROMPT_COMMAND
: Sie definieren sie in,.bashrc
sodass sie in jeder Shell definiert werden (auch in nicht interaktiven, was ebenfalls verschwenderisch ist).Das ist also alles, was mit meiner Geschichte zu
.bashrc
tun hat:Getestet mit bash 3.2.17 unter Mac OS X 10.5, bash 4.1.7 unter 10.6.
quelle
sleep 9999
und (ohne auf das Ende des Ruhezustands zu warten) in Shell-Fenster B möchte ichsleep 9999
in der Bash-Historie sehen können.href
, der den Verlauf meines aktuellen Terminals sofort aktualisiert und dabei die Verlaufsdatei bereinigt. Jedes Mal, wenn ich ein neues Terminal öffne, wird diese Bereinigung / Synchronisierung in meiner bashrc-Datei ausgeführt, sodass das neue Terminal den neuesten Verlauf aufweist. Ich benutze das zusammen mithistory -a
export
die Variablen: Sie definieren sie in,.bashrc
so dass sie in jeder Shell definiert werden (auch in nicht interaktiven, was ebenfalls verschwenderisch ist)Hier ist mein Versuch, den Verlauf der Bash-Sitzung zu teilen. Dies ermöglicht die gemeinsame Nutzung des Verlaufs zwischen Bash-Sitzungen, sodass der Verlaufszähler nicht verwechselt wird und die Verlaufserweiterung wie
!number
gewünscht funktioniert (mit einigen Einschränkungen).Verwendung von Bash Version 4.1.5 unter Ubuntu 10.04 LTS (Lucid Lynx).
Erläuterung:
Hängen Sie die gerade eingegebene Zeile an
$HISTFILE
(Standard ist.bash_history
). Dadurch wird$HISTFILE
eine Zeile größer.Wenn Sie die Spezialvariable
$HISTFILESIZE
auf einen bestimmten Wert setzen, wird Bash$HISTFILE
nicht länger als$HISTFILESIZE
Zeilen gekürzt, indem die ältesten Einträge entfernt werden.Löschen Sie den Verlauf der laufenden Sitzung. Dadurch wird der Verlaufszähler um den Betrag von reduziert
$HISTSIZE
.Lesen Sie den Inhalt von
$HISTFILE
und fügen Sie ihn in den aktuellen Sitzungsverlauf ein. Dadurch wird der Verlaufszähler um die Anzahl der Zeilen in erhöht$HISTFILE
. Beachten Sie, dass die Zeilenzahl von$HISTFILE
nicht unbedingt ist$HISTFILESIZE
.Die
history()
Funktion überschreibt den integrierten Verlauf, um sicherzustellen, dass der Verlauf synchronisiert ist, bevor er angezeigt wird. Dies ist für die Historienerweiterung nach Zahlen erforderlich (dazu später mehr).Weitere Erklärung:
Schritt 1 stellt sicher, dass der Befehl aus der aktuell ausgeführten Sitzung in die globale Verlaufsdatei geschrieben wird.
Schritt 4 stellt sicher, dass die Befehle aus den anderen Sitzungen in den aktuellen Sitzungsverlauf eingelesen werden.
Da Schritt 4 den Verlaufszähler erhöht, müssen wir den Zähler auf irgendeine Weise reduzieren. Dies erfolgt in Schritt 3.
In Schritt 3 wird der Historienzähler um reduziert
$HISTSIZE
. In Schritt 4 wird der Verlaufszähler um die Anzahl der Zeilen in erhöht$HISTFILE
. In Schritt 2 stellen wir sicher, dass die Zeilenzahl$HISTFILE
genau ist$HISTSIZE
(dies bedeutet,$HISTFILESIZE
dass die gleiche sein muss wie$HISTSIZE
).Über die Einschränkungen der Historienerweiterung:
Wenn durch die Anzahl der Geschichte Expansion verwenden, sollten Sie immer die Nummer nachschlagen unmittelbar vor dem Einsatz. Das bedeutet, dass zwischen dem Nachschlagen und der Verwendung der Nummer keine Eingabeaufforderung angezeigt wird. Das bedeutet normalerweise kein Enter und kein Strg + C.
Im Allgemeinen gibt es nach mehr als einer Bash-Sitzung keine Garantie dafür, dass eine Verlaufserweiterung nach Nummer ihren Wert zwischen zwei Bash-Eingabeaufforderungsanzeigen beibehält. Denn wenn
PROMPT_COMMAND
ausgeführt wird, wird der Verlauf aller anderen Bash-Sessions in den Verlauf der aktuellen Session integriert. Wenn eine andere Bash-Sitzung einen neuen Befehl hat, unterscheiden sich die Verlaufsnummern der aktuellen Sitzung.Ich finde diese Einschränkung vernünftig. Ich muss die Nummer ohnehin jedes Mal nachschlagen, weil ich mich nicht an willkürliche Verlaufsnummern erinnern kann.
Normalerweise verwende ich die Verlaufserweiterung nach dieser Nummer
Ich empfehle die Verwendung der folgenden Bash-Optionen.
Seltsame Bugs:
Wenn Sie den Befehl history ausführen, der an eine beliebige Stelle weitergeleitet wird, wird dieser Befehl zweimal im Verlauf aufgeführt. Zum Beispiel:
Alle werden zweimal in der Historie aufgeführt. Ich habe keine Idee warum.
Verbesserungsvorschläge:
Ändern Sie die Funktion
_bash_history_sync()
so, dass sie nicht jedes Mal ausgeführt wird. Beispielsweise sollte es nicht nach einerCTRL+C
Aufforderung ausgeführt werden. IchCTRL+C
verwerfe oft eine lange Befehlszeile, wenn ich beschließe, diese Zeile nicht auszuführen. Manchmal muss ich verwendenCTRL+C
, um ein Bash-Abschlussskript zu stoppen.Befehle aus der aktuellen Sitzung sollten immer die aktuellsten im Verlauf der aktuellen Sitzung sein. Dies hat auch den Nebeneffekt, dass eine bestimmte Verlaufsnummer ihren Wert für Verlaufseinträge aus dieser Sitzung beibehält.
quelle
history -n
weil es den Verlaufszähler durcheinander bringt . Ich fandhistory -n
es auch zu unzuverlässig.history -a
, ohne-c
und-r
in Bezug auf die Benutzerfreundlichkeit besser ist (obwohl dies nicht die Frage ist, die gestellt wurde). Dies bedeutet, dass Befehle, die Sie ausführen, sofort in neuen Shells verfügbar sind, noch bevor Sie die aktuelle Shell verlassen, jedoch nicht in gleichzeitig ausgeführten Shells. Auf diese Weise wählt Arrow-Up immer die zuletzt ausgeführten Befehle der aktuellen Sitzung aus , was für mich weniger verwirrend ist.Mir ist keine Verwendung bekannt
bash
. Aber es ist eines der beliebtesten Features vonzsh
.Ich persönlich bevorzuge
zsh
es,bash
also empfehle ich es zu versuchen.Hier ist der Teil von mir
.zshrc
, der sich mit der Geschichte befasst:quelle
Dazu müssen Sie Ihrem Text zwei Zeilen hinzufügen
~/.bashrc
:Von
man bash
:quelle
Sie können Ihre BASH-Eingabeaufforderung so bearbeiten, dass die von Mürr vorgeschlagenen Befehle "history -a" und "history -r" ausgeführt werden:
(falls Sie etwas vermasseln, was fast garantiert ist)
(Beachten Sie, dass dies ein Back-Tick ist. Sie führen bei jeder Eingabeaufforderung den Verlauf -a und den Verlauf -r aus. Da sie keinen Text ausgeben, bleibt Ihre Eingabeaufforderung unverändert.
Sobald Sie Ihre PS1-Variable wie gewünscht eingerichtet haben, legen Sie sie dauerhaft in Ihrer ~ / .bashrc-Datei fest.
Wenn Sie beim Testen zu Ihrer ursprünglichen Eingabeaufforderung zurückkehren möchten, gehen Sie wie folgt vor:
Ich habe grundlegende Tests durchgeführt, um sicherzustellen, dass es funktioniert, kann aber nicht
history -a;history -r
bei jeder Eingabeaufforderung auf Nebenwirkungen hinweisen.quelle
Wenn Sie eine Lösung für die Bash- oder Zsh-Verlaufssynchronisierung benötigen, die auch das unten stehende Problem löst, lesen Sie diese unter http://ptspts.blogspot.com/2011/03/how-to-automatically-synchronize-shell.html
Das Problem ist das Folgende: Ich habe zwei Shell-Fenster A und B. In Shell-Fenster A starte ich
sleep 9999
und (ohne darauf zu warten, dass der Ruhezustand beendet ist) in Shell-Fenster B möchte ich in der Lage sein,sleep 9999
den Bash-Verlauf zu sehen.Der Grund, warum die meisten anderen Lösungen dieses Problem nicht lösen können, ist, dass sie ihre Verlaufsänderungen in die Verlaufsdatei schreiben, indem sie
PROMPT_COMMAND
oderPS1
, die beide zu spät ausgeführt werden, erst nachsleep 9999
Beendigung des Befehls verwenden.quelle
Mit können Sie
history -a
den Verlauf der aktuellen Sitzung an die Histdatei anhängen und dannhistory -r
auf den anderen Terminals die Histdatei lesen.quelle
Richtig, also hat mich das schließlich geärgert, eine anständige Lösung zu finden:
Was dies bedeutet, ist eine Art Verschmelzung dessen, was in diesem Thread gesagt wurde, mit der Ausnahme, dass ich nicht verstehe, warum Sie die globale Historie nach jedem Befehl neu laden sollten. Ich kümmere mich sehr selten darum, was in anderen Terminals passiert, aber ich führe immer eine Reihe von Befehlen aus, beispielsweise in einem Terminal:
(Vereinfachtes Beispiel)
Und in einem anderen:
Auf keinen Fall möchte ich, dass der Befehl geteilt wird
quelle
Hier ist eine Alternative, die ich benutze. Es ist umständlich, behebt jedoch das von @axel_c erwähnte Problem, bei dem manchmal eine separate Verlaufsinstanz in jedem Terminal gewünscht wird (eine für make, eine für monitoring, eine für vim usw.).
Ich behalte eine separate angehängte Verlaufsdatei, die ich ständig aktualisiere. Ich habe die folgenden Hotkeys zugeordnet:
Damit wird der gesamte Verlauf des aktuellen Terminals an eine Datei mit dem Namen master_history.txt in Ihrem Ausgangsverzeichnis angehängt.
Ich habe auch einen separaten Hotkey zum Durchsuchen der Master-History-Datei:
Ich benutze Katze | grep, weil es den Cursor am Ende verlässt, um meinen regulären Ausdruck einzugeben. Ein weniger hässlicher Weg, dies zu tun, wäre, ein paar Skripte zu Ihrem Pfad hinzuzufügen, um diese Aufgaben zu erledigen, aber Hotkeys funktionieren für meine Zwecke. Ich werde auch in regelmäßigen Abständen den Verlauf von anderen Hosts abrufen, an denen ich gearbeitet habe, und diesen Verlauf an meine master_history.txt-Datei anhängen.
Es ist immer schön, in der Lage zu sein, schnell nach diesem kniffligen Regex oder diesem seltsamen Perl-Einzeiler zu suchen, den Sie vor 7 Monaten erfunden haben.
quelle
Ich kann eine Lösung für die letzte anbieten: Stellen Sie sicher, dass die env-Variable HISTCONTROL nicht "ignorespace" (oder "ignoreboth") angibt.
Aber ich spüre Ihren Schmerz bei mehreren gleichzeitigen Sitzungen. Es ist einfach nicht gut in bash gehandhabt.
quelle
Hier ist meine Erweiterung zu @ lesmanas Antwort . Der Hauptunterschied besteht darin, dass gleichzeitige Fenster den Verlauf nicht gemeinsam nutzen. Dies bedeutet, dass Sie in Ihren Fenstern weiterarbeiten können, ohne dass Kontext von anderen Fenstern in Ihre aktuellen Fenster geladen wird.
Wenn Sie explizit 'history' eingeben ODER wenn Sie ein neues Fenster öffnen, erhalten Sie den Verlauf von allen vorherigen Fenstern.
Außerdem verwende ich diese Strategie, um jeden Befehl zu archivieren, der jemals auf meinem Computer eingegeben wurde.
quelle
Ich habe mich dafür entschieden, den Verlauf in eine Datei pro Tag zu schreiben, da mehrere Personen auf demselben Server arbeiten können. Durch das Trennen der Befehle jeder Sitzung wird die Prüfung vereinfacht.
Die Geschichte sieht jetzt so aus:
Die Dateien sehen folgendermaßen aus:
quelle
An dieser Stelle möchte ich auf ein Problem hinweisen
und
Wenn Sie source ~ / .bashrc ausführen, lautet das $ PROMPT_COMMAND wie folgt
und
Diese Wiederholung erfolgt jedes Mal, wenn Sie 'source ~ / .bashrc' ausführen. Sie können PROMPT_COMMAND nach jedem Ausführen von 'source ~ / .bashrc' überprüfen, indem Sie 'echo $ PROMPT_COMMAND' ausführen.
Sie konnten sehen, dass einige Befehle anscheinend nicht funktionierten: "history -n history -a". Aber die gute Nachricht ist, dass es immer noch funktioniert, da andere Teile immer noch eine gültige Befehlssequenz bilden (nur mit einigen zusätzlichen Kosten, da einige Befehle wiederholt ausgeführt werden. Und nicht so sauber.)
Persönlich benutze ich folgende einfache Version:
das hat die meisten der Funktionalitäten, während kein solches Problem wie oben erwähnt.
Ein weiterer Punkt ist: Es gibt wirklich nichts Magisches . PROMPT_COMMAND ist nur eine einfache Bash-Umgebungsvariable. Die darin enthaltenen Befehle werden ausgeführt, bevor Sie die Bash-Eingabeaufforderung (das $ -Zeichen) erhalten. Beispielsweise lautet Ihr PROMPT_COMMAND "echo 123" und Sie führen "ls" in Ihrem Terminal aus. Der Effekt ist wie das Ausführen von "ls; echo 123".
Ausgabe (So wie 'PROMPT_COMMAND = "echo 123"; $ PROMPT_COMMAND' ausgeführt wird):
Führen Sie Folgendes aus:
Ausgabe:
"history -a" wird verwendet, um die history-Befehle in den Speicher von ~ / .bash_history zu schreiben
Mit "history -c" werden die Verlaufsbefehle im Speicher gelöscht
"history -r" wird verwendet, um Verlaufsbefehle von ~ / .bash_history in den Speicher zu lesen
Eine Erklärung zu den history-Befehlen finden Sie hier: http://ss64.com/bash/history.html
PS: Wie andere Benutzer bereits betont haben, ist der Export nicht erforderlich. Siehe: Verwenden des Exports in .bashrc
quelle
Ich habe ein Skript zum Festlegen einer Verlaufsdatei pro Sitzung oder Aufgabe auf der Grundlage der folgenden Informationen geschrieben.
Es ist nicht notwendig, jeden Verlaufsbefehl zu speichern, aber es speichert die, die mir wichtig sind, und es ist einfacher, sie abzurufen, als jeden Befehl zu durchlaufen. Meine Version listet auch alle Verlaufsdateien auf und bietet die Möglichkeit, sie alle zu durchsuchen.
Vollständige Quelle: https://github.com/simotek/scripts-config/blob/master/hiset.sh
quelle
Hier ist eine Lösung, die nicht die Historien einzelner Sitzungen verwechselt!
Grundsätzlich muss der Verlauf jeder Sitzung separat gespeichert und bei jeder Aufforderung neu erstellt werden. Ja, es werden mehr Ressourcen verwendet, aber es ist nicht so langsam, wie es sich anhört. Die Verzögerung macht sich erst bemerkbar, wenn Sie mehr als 100000 Verlaufseinträge haben.
Hier ist die Kernlogik:
In dieser Übersicht finden Sie eine vollständige Lösung, einschließlich einiger Sicherheitsmaßnahmen und Leistungsoptimierungen.
quelle
Dies funktioniert bei ZSH
quelle
Ich wollte dies seit langem, vor allem die Möglichkeit, einen Befehl abzurufen, indem er ausgeführt wurde, um ihn in einem neuen Projekt erneut auszuführen (oder ein Verzeichnis mit einem Befehl zu finden). Deshalb habe ich dieses Tool zusammengestellt, das frühere Lösungen zum Speichern eines globalen CLI-Verlaufs mit einem interaktiven Grepping-Tool namens Percol (C ^ R zugeordnet) kombiniert. Es ist auf dem ersten Computer, auf dem ich mit der Verwendung begonnen habe, immer noch ein Kinderspiel.
Mit dem lokalen CLI-Verlauf ist es in Bezug auf die Pfeiltasten nicht verwirrend, aber Sie können ganz einfach auf den globalen Verlauf zugreifen (den Sie auch einem anderen Element als C ^ R zuordnen können).
quelle
Weil ich unendliche Geschichte bevorzuge, die in einer benutzerdefinierten Datei gespeichert ist. Ich erstelle diese Konfiguration basierend auf https://stackoverflow.com/a/19533853/4632019 :
quelle
Hier ist der Ausschnitt aus meinem .bashrc und kurze Erklärungen, wo immer nötig:
HISTFILESIZE und HISTSIZE sind persönliche Einstellungen und können nach Belieben geändert werden.
quelle