Befehl in der xterm-Titelleiste anzeigen


23

Meine Bash-Eingabeaufforderung setzt derzeit die xterm-Titelleiste in der folgenden Reihenfolge:

PS1='\033]0;\u@\h>\w\007'

Gibt es eine einfache Möglichkeit, den aktuellen Befehl in der Titelleiste anzuzeigen? Wenn ich beispielsweise eine Datei mithilfe von "Tailing" tail -f foo.loganpasse, soll dies in der Titelleiste angezeigt werden tail -f foo.log.

Antworten:


16

Grundsätzlich benötigen Sie:

trap 'printf "\033]0;%s\007" "${BASH_COMMAND//[^[:print:]]/}"' DEBUG

am ende deines .bashrcoder eines ähnlichen. Ich habe eine Weile gebraucht, um das herauszufinden - siehe meine Antwort hier für weitere Informationen :)


Danke für diese Lösung simon! Wenn ich dies jedoch .bashrcnach jedem Befehl in meiner Shell zu meinem hinzufüge, erhalte ich diese Ausgabe 0;%s@%s:%s" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}. Ich gehe davon aus, dass ich diese Ausgabe durch Zuweisen des Trap-Befehls unterdrücken kann PS1. Funktioniert jedoch PS1=trap 'echo -ne "\033]0;$BASH_COMMAND\007"' DEBUGnicht. Es führt zu dem Fehler bash: echo -ne "\033]0;$BASH_COMMAND\007": command not found.
Orschiro

Übrigens, ich habe gerade stackoverflow.com/questions/48407130/… ausgefüllt , was vermutlich darauf zurückzuführen ist, dass dieser Rat angewendet wurde. Die Falle sollte nach stderr oder direkt nach TTY schreiben, nicht nach stdout.
Charles Duffy

1
@orschiro, der Rat, den trapBefehl als separaten Befehl auszuführen und nicht PS1 zuzuweisen.
Charles Duffy

12

(Inspiriert von dieser SU-Antwort )

Sie können ein paar Bash-Tricks kombinieren:

  • Wenn Sie ein DEBUG-Signal abfangen, wird der Handler aufgerufen, bevor jeder Befehl ausgeführt wird
  • Die Variable $BASH_COMMANDenthält den aktuell ausgeführten Befehl

Fangen Sie also DEBUG ein und lassen Sie den Handler den Titel setzen auf $BASH_COMMAND:

trap 'printf "\033]0;%s\007" "${BASH_COMMAND//[^[:print:]]/}" >&2' DEBUG

Dadurch wird der Titel so lange geändert, bis etwas anderes ihn ändert. Solange Sie jedoch $PS1unverändert bleiben, ist dies kein Problem. Wenn Sie einen Befehl starten, ändert der DEBUG-Handler die Titelleiste, und wenn der Befehl abgeschlossen ist, zeichnet er einen neuen Eingabeaufforderung und setzt die Titelleiste erneut zurück.

Ein nützlicher Tipp, der hier zu finden ist (auch woher diese SU-Antwort stammt), lautet:

set -o functrace

Dadurch wird die DEBUG-Falle von der Bash an alle von Ihnen gestarteten Subshells weitergegeben. Andernfalls wird die Titelleiste in ihnen nicht geändert


Ha! Gleiche Antwort genau zur gleichen Zeit! +1 für die Behandlung von Unterschalen, aber haben Sie eine Antwort auf das Rohrleitungsproblem? (Siehe meinen Link zur SO-Frage)
Simon

Funktioniert nicht durchssh
abyss.7

Tötet auch die Vollendung auf "tab"
abyss.7

Übrigens, ich habe gerade stackoverflow.com/questions/48407130/… ausgefüllt , was vermutlich darauf zurückzuführen ist, dass dieser Rat angewendet wurde. Die Falle sollte nach stderr oder direkt nach TTY schreiben, nicht nach stdout.
Charles Duffy

Wäre es nicht besser, zu /dev/ttystderr umzuleiten ?
Aaron Digulla

2

Ich habe meine eigene Lösung aus verschiedenen Beiträgen heraus erarbeitet. Dadurch wird ein Titel erstellt, der Benutzer, Hostname, pwd, tty und den aktuell ausgeführten Befehl (für bash) enthält.

Das sieht so aus (es wird kein Befehl ausgeführt):

.:[user@hostname:/home/user][pts/10]:.

Und so (Befehl ausführen):

.:[user@hostname:/home/user][pts/10] {tail -F /var/log/syslog}:.

Irgendwo in der .bashrc habe ich PS1 erweitert:

# set the terminals title. This is the "post-command" part,
# need to use a trap for pre-command (to add the command line to the title)
PS1+="\[\033]2;.:[\u@\h:\$PWD] [$(tty | cut -b 6-)]:.\007\]"

Fügt den aktuellen Befehl mit Verlauf 1 und Trap hinzu :

# set a fancy title (this is pre-command, in PS1 is after-command (to reset command)
trap 'echo -ne "\033]2;.:[${USER}@${HOSTNAME}:${PWD}] [$(tty | cut -b 6-)] {$(history 1 | sed "s/^[ ]*[0-9]*[ ]*//g")}:.\007"' DEBUG

Fühlen Sie sich frei, sich Ihren Bedürfnissen anzupassen.


Übrigens, ich habe gerade stackoverflow.com/questions/48407130/… ausgefüllt , was vermutlich darauf zurückzuführen ist, dass dieser Rat angewendet wurde. Die Falle sollte nach stderr oder direkt nach TTY schreiben, nicht nach stdout.
Charles Duffy
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.