Kann ich meinen Verlauf problemlos in vielen Bildschirmfenstern durchsuchen?


11

In meiner aktuellen screenSitzung sind 12 Fenster geöffnet. Es läuft seit Wochen ... Ich weiß, dass ich letzte Woche irgendwann einen ImageMagick- convertBefehl in einem dieser 12 Bildschirmfenster ausgeführt habe ... gibt es eine Möglichkeit, den Bash-Verlauf aller 12 Instanzen einfach zu durchsuchen, ohne sie zu schließen oder auszuführen history | grep convertin allen 12 Bildschirmen?


1
Ich benutze Zsh und ich habe setopt share_historyin, /etc/zsh/zshrcso dass mir dieses Problem nie passieren sollte: P
Phunehehe

Antworten:


18

Sie können history -a; history -cin allen Fenstern ausgeführt werden, um den Verlauf zu speichern. Und dann history -r, um es zu aktualisieren.

Um es dauerhafter zu lösen, fügen Sie Folgendes hinzu .bashrc:

export PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"

2
Das ist großartig, danke! Das einzige Problem ist, dass wenn Sie etwas in eine Shell eingeben und dann zu einer anderen wechseln und sofort den Verlauf eingeben, es nicht im Verlauf angezeigt wird. Dies liegt daran, dass PROMPT_COMMAND noch nicht ausgeführt wurde und die Aktualisierung daher nicht erfolgt ist. Sie müssen zuerst im zweiten Fenster die Eingabetaste drücken (oder einen anderen Befehl ausführen) und dann history eingeben.
Javid Jamae

1

Klingt schwierig. Hier sind einige Methoden, die für Sie funktionieren können.

Wenn Sie Prozessabrechnungstools installiert haben (unter Linux suchen Sie nach einem Paket mit dem Namen acct) und die Berechtigung zu deren Verwendung haben, können Sie herausfinden, wann und möglicherweise auf welchem ​​Terminal Sie ausgeführt haben convert:

lastcomm convert

Wenn dies nicht verfügbar oder nicht eindeutig ist, können Sie historyin jeder Bash-Instanz einen Befehl ausführen , um nach convertBefehlen zu suchen . Dadurch werden auch Befehle gefunden, die sich in der Verlaufsdatei befanden, als bash gestartet wurde.

: >/tmp/convert.history
for w in $(seq 0 11); do
  screen -p $w -X stuff \
    'history | sed 's/^.*convert/'$w'&/" >>/tmp/convert.history
'; done
  • $(seq 0 11)iteriert über die Nummern Ihrer Bildschirmfenster. Stellen Sie sicher, dass Sie Fenster überspringen, in denen derzeit kein Bash ausgeführt wird, sondern ein anderer Prozess, der die Eingabe anders interpretiert.
  • screen -p $w stuff …sendet die folgende Zeichenfolge als Eingabe an das angegebene Fenster. Sie benötigen den Zeilenumbruch am Ende der Zeichenfolge.
  • Die Datei /tmp/convert.historyenthält eine Liste von Zeilen wie 3 convert foo.jpg, wenn Sie convert foo.jpgin Fenster 3 ausgeführt haben.

1
Leider haben diese nicht funktioniert. :-( Ich bin gerade history | grep convertin allen Fenstern gelaufen . Ich bin enttäuscht, ich wollte eine weitere großartige Antwort von Gilles akzeptieren!
Josh

1

Mit tcsh können Sie den Verlauf zwischen Sitzungen mithilfe des periodischen Alias ​​freigeben.

In Ihrer .cshrc- (oder .tcshrc-) Datei:

set tperiod = 60 #(or any other number.  Time in minutes between refreshing)
alias periodic 'history -S; echo "Syncing history"'

Dadurch wird der Verlaufsbefehl automatisch alle 60 Minuten ausgeführt. Dadurch wird der Verlauf in einer allgemeinen Verlaufsdatei in Ihrem Home-Verzeichnis gespeichert. Um den Verlauf häufiger zu aktualisieren, verringern Sie entweder die Tperiodennummer oder führen Sie einfach den Befehl "periodisch" aus, um die Aktualisierung manuell durchzuführen


0

Bash schreibt die Geschichte nur beim Beenden, was dies bestenfalls problematisch macht. Ich habe gehört, dass zsh den Verlauf zwischen aktiven Sitzungen teilen kann.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.