Bash-History-Behandlung mit mehreren Terminals

110

Ich verwende hauptsächlich Terminator und es wird normalerweise mit 3 geteilten Terminalfenstern geöffnet. Ich benutze auch Gnome Terminal aus verschiedenen Gründen.
Ich frage mich, wie der Bash-Verlauf in diesem Fall behandelt wird, da ich manchmal zuvor ausgegebene Befehle verpasse, wenn ich sie ausführehistory

In meiner Eingabeaufforderung wird beispielsweise die aktuelle Bash-Verlaufszeile ( \!) angezeigt. Wenn ich Terminator mit drei geteilten Terminalfenstern starte, wird auf allen Terminals dieselbe Verlaufszeile (z. B. 100) angezeigt. Welche Geschichte wird gespeichert?

Wenn ich Gnome Terminal nach der Verwendung von Terminator starte, erhalte ich beim Start Zeile 100, unabhängig von allen zuvor in Terminator ausgegebenen Befehlen

Zetah
quelle
Related on Unix SE: Bash-Verlauf in mehreren Terminalfenstern
beibehalten

Antworten:

107

Die gespeicherte Bash-Sitzung gilt für das Terminal, das zuletzt geschlossen wurde. Wenn Sie die Befehle für jede Sitzung speichern möchten, können Sie den hier erläuterten Trick verwenden .

export PROMPT_COMMAND='history -a'

So zitieren Sie die Manpage: "Wenn gesetzt, wird der Wert vor jeder primären Eingabeaufforderung als Befehl ausgeführt."

Jedes Mal, wenn mein Befehl beendet ist, hängt er das ungeschriebene Verlaufselement an, ~/.bash_historybevor die Eingabeaufforderung (nur $ PS1) erneut angezeigt wird.

Nachdem ich diese Zeile eingegeben habe, muss /etc/bash.bashrcich mich nicht mehr damit abfinden, Räder neu zu erfinden oder wertvolle Sekunden zu verlieren, um Dinge neu zu tippen, nur weil ich mit meinen Terminals faul war.

Auf jeden Fall müssen Sie berücksichtigen, dass Befehle aus verschiedenen Sitzungen in Ihre Verlaufsdatei gemischt werden, damit es nicht so einfach ist, sie später zu lesen.

Siehe auch:

jcollado
quelle
ist es nicht separat für verschiedene TTL gespeichert?
Vineet Menon
Ausgezeichnet. Danke für die Erklärung und Lösung. Ich habe es mit probiert export PROMPT_COMMAND='history -a; history -r'und im Terminal einige seltsame Verlaufszeilennummern gefunden. Nachdem ich einige Befehlszeilennummern ausgegeben habe, springt die Anzahl um 2000 statt um 1, was seltsam ist, aber wie gesagt: Der gesamte Verlauf des Terminals wird gespeichert.
Zetah
@VineetMenon Weitere Details finden Sie hier . Interessante Teile: Beim Start der Shell wird der Verlauf aus der Datei initialisiert, die von der Variablen HISTFILE (Standard: ~ / .bash_history) angegeben wird. [...] Wenn eine interaktive Shell beendet wird, werden die letzten $ HISTSIZE-Zeilen aus der Verlaufsliste in die Datei mit dem Namen $ HISTFILE kopiert.
jcollado
Diese Website scheint nicht erreichbar zu sein: northernmost.org/blog/flush-bash_history-after-each-command
Shubham
32

Nach mehrmaligem Lesen von verwende man bashich für jede Shell separate History-Dateien. Ich habe mkdir -m 0700 ~/.historydann einen hinzugefügt

[[ -d ~/.history ]] || mkdir --mode=0700 ~/.history
[[ -d ~/.history ]] && chmod 0700 ~/.history
HISTFILE=~/.history/history.$(date +%y%b%d-%H%M%S).$$
# 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 .historyund räum es aus. Es ist schön, jeden Befehl, den ich eingegeben habe, für mich gespeichert zu haben.

Ich habe gerade das Obige benutzt, um zu sehen, was ich in letzter Zeit getan 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 sudo mountin die Sortierkette aufzunehmen).

Waltinator
quelle
3
Warum vergeben Sie HISTFILESIZEzweimal?
Daniel
2
Durch Setzen von HISTFILESIZE auf 0 lösche ich den Verlaufspuffer und setze den Mechanismus zum Speichern des Verlaufs zurück. Dann stelle ich die gewünschte Größe ein und beginne, den Verlauf in HISTFILE zu speichern. Siehe den Abschnitt GESCHICHTE von man bash.
Waltinator
1
Gibt es eine Möglichkeit, die Verlaufsdateien zusammenzuführen, um die Ctrl+rArbeit wieder aufzunehmen?
n611x007
3
Dies sollte eine neue Frage sein, aber ich denke nicht, dass es eine gute Idee ist. Ich verwende stattdessen egrep 'whatever' .history/*(oder cat .history/* | egrep 'whatever') und verwende Strg-R, um den Verlauf einer einzelnen Sitzung zu durchsuchen. Lesen Sie mehr man bash-builtinsüber den Befehl history. Meine sort .history/* | uniq -c | sort -n | wc -lShows 16033 eindeutige Befehle, cut '-d ' -f1 .history/* | sort | uniq -c | sort -nzeigt 2004 eindeutige Befehle, meist Tippfehler. Das alles in die "History-Liste" von bash zu laden, würde nicht helfen.
Waltinator
@waltinator - ich weiß, das ist ein alter Kommentar, aber implizieren Sie, dass das Setzen einer Umgebungsvariablen irgendwie eine sofortige Aktion auslöst? Welcher Prozess erkennt, dass Sie HISTFILESIZE in einer lokalen Shell den Wert 0 zugewiesen haben, und wechselt dann sofort zu 4096? ist dies undokumentiert, wenn bash mit bestimmten variablennamen umgeht?
synchronisiert
8

Um zu zeigen , historyvon allen Terminals:

Fügen Sie export PROMPT_COMMAND='history -a; history -r'Ihrer .bashrc-Datei hinzu.

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


Elijah Lynn
quelle
3
Ich werde sagen, dass ich dies nach ein paar Monaten der Nutzung erst kürzlich auskommentiert habe. Es ist bittersüß, da ich nicht immer die letzten 100 Befehle durchsuchen möchte, um nur den Befehl auszuführen, den ich ursprünglich im Tmux-Bereich ausgeführt habe. Manchmal habe ich möglicherweise 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 seit ungefähr einem Jahr und es löst das Problem. Wenn ich den neuesten Verlauf aus anderen Sitzungen erhalten möchte, führe ich einfach diesen Befehl aus und er steht mir sofort zur Verfügung.
Elijah Lynn
Export ist nicht erforderlich.
Eingeschränktes Sühnopfer
6

Eine weitere Alternative finden Sie unter " Behalten der persistenten Historie in der Bash ". Sie werden aufgefordert, alle Befehle, die jemals in ein Terminal eingegeben wurden, in einer "persistenten Verlaufsdatei" zu speichern (neben den üblichen Vorgängen für normale Benutzer .history).

Eli Bendersky
quelle
1
Ich habe $$ eingefügt , um die Zeile zu echo $$ $date_part "$command_part" >> ~/.persistent_historyerstellen. Dadurch werden den Einträgen die PIDs ihres Bash-Prozesses vorangestellt, damit wir mehrere Historien entwirren können.
Evgeni Sergeev
Kann der alternative Verlauf für die CTRL-R-Verlaufssuche verwendet werden?
Max