Ist es möglich, direkt an .bash_history zu schreiben?

124

Ich öffne oft sehr viele Terminals [Im Moment sind 7 in diesem Arbeitsbereich geöffnet] und ich suche oft historymit grep, um einen Befehl zu finden, den ich gerade geschrieben habe, aber ich möchte nicht das Terminal suchen und dann nach oben scrollen und danach mehr suchen, etc .. Manchmal schließen sich meine Terminals ohne "Verlassen", und alles, was ich geschrieben habe, geht verloren [Manchmal brauchte ich etwas, das ich in einem Terminal geschrieben hatte, das getötet wurde].

Gibt es eine Möglichkeit, dies so zu gestalten, dass jedes Terminal sofort in .bash_history schreibt? oder mindestens einmal in der Minute oder so?

Matt
quelle
2
Normalerweise verwende ich control-r, um die Befehlshistorie einer Bash rückwärts zu durchsuchen. Bequemer als history | grepwenn Sie keinen regulären Ausdruck benötigen.
Peter Cordes

Antworten:

92

Eine einfache Lösung, wie im Abschnitt Aktualisieren des Bash-Verlaufs in Echtzeit beschrieben .

Es heißt, diese Befehle in der .bashrc-Konfiguration abzulegen:

shopt -s histappend
PROMPT_COMMAND="history -a;$PROMPT_COMMAND"

Der erste Befehl ändert den .historyDateimodus zum Anhängen. Mit der zweiten Option wird der history -aBefehl so konfiguriert , dass er an jeder Shell-Eingabeaufforderung ausgeführt wird. Der -aschreibt sofort die aktuellen / neuen Zeilen in die History-Datei.

Verwandte für zsh:

Mario
quelle
1
Nun, diese Art von Arbeiten. Ich habe weitere Tests versucht und es scheint nur mit dem ersten Befehl zu funktionieren. funktioniert es bei dir richtig
Matt
54

Versuchen Sie dies in Ihre .bashrc:

shopt -s histappend                      # append to history, don't overwrite it
export PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"

Gutschrift hier: https://stackoverflow.com/questions/103944/real-time-history-export-amongst-bash-terminal-windows/3055135

history -clöscht den Verlauf der laufenden Sitzung. Dadurch wird der Verlaufszähler um den Betrag von reduziert $HISTSIZE. history -rLesen Sie den Inhalt von $HISTFILEund fügen Sie ihn in den aktuellen Sitzungsverlauf ein. Dies erhöht den Verlaufszähler um die Anzahl der Zeilen in $HISTFILE.

Ich denke, es bedeutet, dass die Befehle fast sofort verfügbar sind (Sie haben ein Terminal, schreiben echo 1, zweites Terminal echo 2, zuerst echo 3und wenn Sie den Pfeil zweimal nach unten drücken, sollten Sie echo 2verfügbar sein. Sie müssen einen Befehl in einem bestimmten Terminal eingeben, um Zugriff auf das zu haben, was hat geschrieben worden.

sup
quelle
Brillant! Vielen Dank. man history
Ich frage
10
@artfulrobot: Dieser Befehl ist ein bashintegrierter Befehl, wie in beschrieben man bash. Sie können auch verwenden help history.
Pabouk
2
Ich habe mein zsh so konfiguriert, dass es so funktioniert: Jede Shell verfolgt ihren EIGENEN Verlauf (und davor den kombinierten Verlauf) und jeder Befehl wird an den kombinierten Verlauf angehängt. Dies ist anders und besser, als immer den Verlauf für jeden Befehl für jede Shell neu zu laden, da ich dazu neige, für jedes Shell-Terminal einen anderen "Arbeitsthread" oder "Job" zu haben. Ich denke, das ist der Unterschied zwischen dem mit -rund dem mit -cnur -a.
Steven Lu
Also, was genau benutzt du? history -c; history -r? Ich denke, es ist besser für dich, es wäre nur manchmal besser für mich. Ich benutze oft mehrere Muscheln, um einen Job zu erledigen, also bevorzuge ich es, die Geschichte so gut wie möglich zu kombinieren. Eigentlich stört es mich, dass der Befehl erst nach seiner Beendigung in die Geschichte geschrieben wird. Wenn ich eine SSH-Sitzung für einen Host starte und eine andere öffnen möchte, während die erste noch ausgeführt wird, muss ich sie normalerweise erneut eingeben, da sie noch nicht in den Verlauf geschrieben wurde.
sup
Ich glaube, ich bin nie lange genug hier geblieben, um herauszufinden, wie man Bash dazu bringt, parallele Verlaufs-Threads (pro Shell-Instanz) gleichzeitig zu verfolgen, während man den Verlauf sofort in die Hauptverlaufs-Datei schreibt. Zsh macht es viel einfacher, außerdem habe ich eine zsh-Funktion definiert, mit der ich eine Menge ausgefallener Metadaten in eine erweiterte Verlaufsdatei meines Entwurfs schreiben kann . Es ist ziemlich unverzichtbar geworden. Wie auch immer, der Mechanismus dort ist precmd () und preexec () für zsh get sent args, die den eingegebenen Befehl beschreiben. Es wird dann trivial, das auf Akten zu lenken. history -akönnte ausreichen
Steven Lu
38

Ich habe eine große Verlaufsdatei mit ungefähr 100000 Einträgen, und die Varianten, die die Verlaufsliste löschen und die gesamte Verlaufsdatei lesen (mit history -cund history -r), führen zu einer merklichen Verzögerung (möglicherweise 0,2 Sekunden), bevor die Eingabeaufforderung angezeigt wird. Die Verwendung, history -ndamit nur neue Zeilen aus der Verlaufsdatei gelesen werden, ist schneller:

shopt -s histappend
PROMPT_COMMAND='history -a;history -n'

PROMPT_COMMAND muss nicht exportiert werden, da es sich um eine Shell-Variable handelt.

Nisetama
quelle
Brillant! Keine verlorene Geschichte mehr, wenn die Verbindung unterbrochen wird!
Tobia
Das ist wunderbar. Durch Anhängen an die Datei und Lesen aus der Datei wird der Verlauf für mehrere Terminals freigegeben.
wisbucky
3

Ein Hinweis für alle anderen Antworten (die im Grunde genommen dasselbe sind):

Das Einstellen PROMPT_COMMAND="history -a;$PROMPT_COMMAND"der .bashrc(oder der Freunde) reicht aus.

Sie können history -aden Verlauf in der aktuellen Sitzung auch jederzeit manuell als "Momentaufnahme" ausführen .

Der Befehl shopt -s histappendwird nicht benötigt, da history -aimmer neue Zeilen an die Datei angehängt werden und diese niemals überschrieben wird. Zumindest ab Bash 4 histappendist dies das Standardverhalten.

Guss
quelle
Auf meinem Mac 10.13.6 schien es ohne den nicht zu funktionieren shopt -s histappend. Beachten Sie auch, dass ich es um ~/.bash_profile
0:51 Uhr
Wahrscheinlich gibt es irgendwo in Ihrem System eine andere Einstellung, die deaktiviert wurde histappend, da dies das Standardverhalten ist. Ich würde danach suchen, aber ich habe keinen Zugang zu einem Mac.
Guss