it-swarm.com.de

Bash: Wie erhalte ich den Befehlsverlauf in einer Bildschirmsitzung?

Wenn ich eine Bildschirmsitzung mit screen -dmS name starte, wie kann ich mit einem Skript auf den Befehlsverlauf dieser Bildschirmsitzung zugreifen?

Verwendung der wird der zuletzt ausgeführte Befehl auch auf dem Bildschirm angezeigt.

16
hexacyanide

screen führt keinen Verlauf der Befehle, die Sie eingeben. Ihre Shell kann eine Historie führen oder nicht. Da Sie scheinbar bash verwenden, können Sie den Befehl history verwenden.

screen scheint eine grobe Annäherung an eine Verlaufssuche zu haben (sie durchsucht lediglich den Scrollback-Puffer nach einer Befehlszeile. Siehe die Manpage screen unter dem Befehl "history" (standardmäßig an C-a { gebunden).

7
chepner

Ich verwende die Standard-Bash-Shell auf meinem System und funktioniert daher möglicherweise nicht mit anderen Shells.

dies ist, was ich in meiner ~/.screenrc-Datei habe, so dass jedes neue Fenster seine eigene Befehlsgeschichte erhält:

Standardbildschirmfenster mit eigenem Befehlsverlauf

Um eine Reihe von Standardbildschirmfenstern mit jeweils eigenen Befehlsverlaufsdateien zu öffnen, können Sie der Datei ~/.screenrc Folgendes hinzufügen:

screen -t "window 0" 0 bash -ic 'HISTFILE=~/.bash_history.${WINDOW} bash'
screen -t "window 1" 1 bash -ic 'HISTFILE=~/.bash_history.${WINDOW} bash'
screen -t "window 2" bash -ic 'HISTFILE=~/.bash_history.${WINDOW} bash'

Stellen Sie sicher, dass neue Windows ihren eigenen Befehlsverlauf erhalten

Die Standard-Bildschirmeinstellungen bedeuten, dass Sie ein neues Fenster mit Ctrl+a c oder Ctrl+a Ctrl+c erstellen. Wenn Sie jedoch nur das Obenstehende in Ihrer ~/.screenrc-Datei verwenden, wird für diese die Standarddatei ~/.bash_history verwendet. Um dies zu beheben, überschreiben wir die Tastenkombinationen zum Erstellen neuer Fenster. Fügen Sie dies Ihrer ~/.screenrc-Datei hinzu:

bind c screen bash -ic 'HISTFILE=~/.bash_history.${WINDOW} bash'
bind ^C screen bash -ic 'HISTFILE=~/.bash_history.${WINDOW} bash'

Wenn Sie nun ein neues Bildschirmfenster erstellen, wird tatsächlich eine Bash-Shell gestartet, und die Umgebungsvariable HISTFILE wird auf etwas gesetzt, das die aktuelle Bildschirmfensternummer ($WINDOW) enthält.

Befehlsverlaufsdateien werden von Bildschirmsitzungen mit denselben Fensternummern gemeinsam genutzt.

Schreiben Sie bei Ausführung Befehle in $HISTFILE

Wie bei einem normalen Bash-Verhalten wird die Historie nur beim Verlassen des Shell/screen-Fensters in die $HISTFILE-Datei geschrieben. Wenn Sie jedoch möchten, dass Befehle nach der Ausführung des Befehls in die Protokolldateien geschrieben werden und somit sofort für andere Bildschirmsitzungen mit derselben Fensternummer verfügbar sind, können Sie Ihrer ~/.bashrc-Datei Folgendes hinzufügen:

export Prompt_COMMAND="history -a; history -c; history -r; ${Prompt_COMMAND}"

Wenn Sie ein Terminal (oder eine Shell) exit schreiben, schreibt die Shell ihre Historie in $ HISTFILE. Um die Historie eines anderen Terminals zu erhalten, können Sie exit in das Terminal eingeben, von dem Sie die Historie erhalten möchten.

cat $HISTFILE
#or tac, less, $EDITOR, ... depending on how you want to "access" it
2
technosaurus

verwenden Sie folgendes: Bildschirm -L mit Großbuchstaben L . Es speichert eine Kopie der Eingabe und Ausgabe des Terminals in einer Datei namens screenlog.0 oder, falls Sie diese verwenden -S um es zu benennen, erhält die Protokolldatei den Namen des Bildschirms 

1
mehrdad

Ich füge die nächsten Zeilen in meine .bashrc ein:

case "$TERM" in
   screen)
       declare SCREEN_NAME=$(echo $STY | sed -nr 's/[^.]*\.(.*)/\1/p')
       if [[ $SCREEN_NAME ]]; then
           HISTFILE="${HISTFILE}.${SCREEN_NAME}.${WINDOW}"
           declare -p HISTFILE
       fi
       unset SCREEN_NAME
       ;;
   *)
       ;;
esac

Meine Standardeinstellung .bashrc hat diesen 'case' grundsätzlich mit 'xterm * | rxvt *)', daher habe ich nur meinen 'screen'-Teil hinzugefügt. Wenn Sie diesen Fall nicht haben, können Sie stattdessen den nächsten verwenden:

if [[ $TERM == screen ]]; then
   declare SCREEN_NAME=$(echo $STY | sed -nr 's/[^.]*\.(.*)/\1/p')
   if [[ $SCREEN_NAME ]]; then
       HISTFILE="${HISTFILE}.${SCREEN_NAME}.${WINDOW}"
       declare -p HISTFILE
   fi
   unset SCREEN_NAME
fi

Und nachdem ich eine eigene bash_history für alle Fenster meines gesamten Bildschirms habe .

Hinweis: Dies funktioniert nicht in Chroot!

1
Regisz

@technosaurus hat recht. $ HISTFILE wird geschrieben, wenn bash beendet wird. Sie können also eine bash-Sitzung beenden und eine neue starten, und der Verlauf sollte durch die Datei erhalten bleiben.

Aber ich denke, es gibt einen besseren Weg, um Ihr Problem zu lösen. Das bash-Handbuch enthält eine Beschreibung des integrierten Befehls history . Sie können diesen Verlauf mit history -w [filename] speichern und den Verlauf mit history -r [filename] lesen. Wenn Sie keinen Dateinamen angeben, wird $ HISTFILE verwendet.

Ich würde also vorschlagen, dass Sie den Verlauf in Ihrer Bildschirmsitzung in einer bestimmten Datei speichern (oder in Ihrer Standard-HISTFILE, wenn Sie möchten). Lesen Sie dann die History-Datei in der anderen Bash-Session, von der aus Sie auf die History zugreifen möchten. Auf diese Weise müssen Sie die ursprüngliche Bash-Sitzung nicht beenden.

1
RaveTheTadpole

history zeigt den gesamten Verlaufsbefehl an.

0