Frage Bash History Handling mit mehreren Terminals


Ich benutze hauptsächlich Terminator, und es wird normalerweise mit 3 geteilten Terminalfenstern geöffnet. Ich benutze Gnome-Terminal auch aus verschiedenen Gründen.
Ich frage mich, wie in diesem Fall bash Geschichte behandelt wird, da ich manchmal zuvor ausgegebene Befehle vermisse, wenn ich laufe history

Zum Beispiel zeigt meine Eingabeaufforderung die aktuelle Bash-Verlaufszeile (\!) und wenn ich Terminator mit 3 geteilten Terminalfenstern starte, bekomme ich die gleiche History Line (sagen wir 100) auf allen Terminals. Welche Geschichte wird gespeichert?

Wenn ich Gnome Terminal nach der Verwendung von Terminator starte, erhalte ich beim Start die Zeile 100, ungeachtet aller zuvor in Terminator ausgegebenen Befehle


89
2017-11-18 06:39


Ursprung




Antworten:


Die Bash-Sitzung, die gespeichert wird, ist diejenige für das Terminal, das spätestens geschlossen ist. Wenn Sie die Befehle für jede Sitzung speichern möchten, können Sie den erklärten Trick verwenden Hier.

export PROMPT_COMMAND='history -a'

Um die Manpage zu zitieren: "Wenn gesetzt, wird der Wert als Befehl vor dem Ausgeben jeder primären Aufforderung ausgeführt."

Jedes Mal, wenn mein Befehl beendet ist, fügt er das ungeschriebene Element an ~/.bash_history bevor die Eingabeaufforderung (nur $ PS1) erneut angezeigt wird.

Also nachdem ich diese Zeile eingefügt habe /etc/bash.bashrc Ich muss nicht herausfinden, dass ich Räder neu erfinde oder wertvolle Sekunden vergeude, wenn ich nur mit meinen Terminals faul bin.

Wie auch immer, Sie müssen berücksichtigen, dass Befehle aus verschiedenen Sitzungen in Ihrer History-Datei gemischt werden, so dass es nicht so einfach ist, sie später zu lesen.

Siehe auch:


82
2017-11-18 06:52



ist es nicht separat für verschiedene TTL gespeichert? - Vineet Menon
Ausgezeichnet. Danke für die Erklärung und Lösung. Ich habe es versucht export PROMPT_COMMAND='history -a; history -r' und ich habe ein paar seltsame History-Zeilennummern im Terminal - nach der Ausgabe einiger Kommando-History-Zeilennummernsprünge um 2000 statt um 1, was seltsam ist, aber es verhält sich wie gesagt - der gesamte Terminalverlauf wird gespeichert. - zetah
@VineetMenon Für weitere Details schauen Hier. Interessante Teile: Wenn die Shell gestartet wird, wird der Verlauf aus der Datei initialisiert, die durch die Variable HISTFILE (Standard `~ / .bash_history ') benannt wird. [...] Wenn eine interaktive Shell beendet wird, werden die letzten $ HISTSIZE-Zeilen aus der History-Liste in die von $ HISTFILE angegebene Datei kopiert. - jcollado
Diese Website scheint nicht erreichbar zu sein: northernmost.org/blog/flush-bash_history-after-each-command - Shubham


Nach mehreren Lesungen von man bashIch verwende separate History-Dateien für jede Shell. Ich habe ein mkdir -m 0700 ~/.history dann hinzugefügt

[[ -d ~/.history ]] || mkdir --mode=0700 ~/.history
[[ -d ~/.history ]] && chmod 0700 ~/.history
HISTFILE=~/.history/history.$$
# close any old history file by zeroing HISTFILESIZE  
HISTFILESIZE=0  
# then set HISTFILESIZE to a large value
HISTFILESIZE=4096  
HISTSIZE=4096  

zu meinem ~/.bashrc. Hin und wieder erinnere ich mich daran du -sk .history und reinige es. Es ist schön, jeden Befehl, den ich eingegeben habe, für mich zu behalten.

Ich habe das obige nur benutzt, um zu sehen, was ich in letzter Zeit gemacht habe:
cut -f1 "-d " .history/* | sort | uniq -c |sort -n -r |less
oder
cut -f1-2 "-d " .history/* | sort | uniq -c |sort -n -r |less
(um das erste Argument z.B. sudo mount in der Sortierkette).


27
2017-11-19 23:48



Warum weisen Sie zu? HISTFILESIZE zweimal? - Daniel
Indem ich HISTFILESIZE auf 0 setze, lösche ich den History-Puffer und setze den History-Speichermechanismus zurück. Dann stelle ich die Größe ein, die ich wirklich möchte, und speichere den Verlauf in HISTFILE. Siehe den Abschnitt GESCHICHTE von man bash. - waltinator
gibt es eine Möglichkeit, die History-Dateien zusammen zu fusionieren Ctrl+r wieder arbeiten? - n611x007
Dies sollte eine neue Frage sein, aber ich denke nicht, dass es eine gute Idee ist. ich benutze egrep 'whatever' .history/* (oder cat .history/* | egrep 'whatever') und verwenden Sie Strg-r, um den Verlauf einer einzelnen Sitzung zu durchsuchen. Lesen man bash-builtins über den History-Befehl. Meine sort .history/* | uniq -c | sort -n | wc -l zeigt 16033 eindeutige Befehle, cut '-d ' -f1 .history/* | sort | uniq -c | sort -n zeigt 2004 einzigartige Befehle, meistens Tippfehler. All das in die "history list" von bash zu laden würde nicht helfen. - waltinator


Siehe auch "beharrliche Geschichte in bash halten"für eine andere Alternative. Es erstellt Ihre Aufforderung, alle Befehle jemals in geschrieben zu senden irgendein Terminal in eine "Persistent History" -Datei (neben dem, was normalerweise für den regulären gemacht wird .history).


4
2018-01-24 23:33



Ich habe eingefügt $$ um die Linie zu machen echo $$ $date_part "$command_part" >> ~/.persistent_history Dies setzt die Einträge mit den PIDs ihres Bash-Prozesses voran, so dass wir mehrere Historien entwirren können. - Evgeni Sergeev


Zeigen history von allen Terminals:

Hinzufügen export PROMPT_COMMAND='history -a; history -r' zu Ihrer .bashrc-Datei.

Quelle: http://northernmost.org/blog/flush-bash_history-after-each-command



4
2017-10-31 19:17



Ich werde sagen, dass ich nach ein paar Monaten, in denen ich dies nutzte, dies erst kürzlich kommentiert habe. Es ist bittersüß, da ich nicht immer die letzten 100 Befehle durchgehen will, nur um die zu starten, die ich ursprünglich im Tmux-Bereich ausgeführt habe. Manchmal habe ich einen dedizierten Protokollbefehl, den ich neu starten muss. - Elijah Lynn
Eine schöne Lösung, die die Fischschale bietet, ist a history --merge. Ich benutze das jetzt seit einem Jahr oder so und es löst das Problem. Wenn ich den neuesten Verlauf von anderen Sitzungen möchte, führe ich einfach diesen Befehl aus und er steht mir sofort zur Verfügung. - Elijah Lynn