Visualizza il comando nella barra del titolo xterm


23

My Bash Prompt sta attualmente impostando la barra del titolo xterm usando la seguente sequenza:

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

C'è un modo semplice per visualizzare il comando corrente nella barra del titolo. Ad esempio, se sto eseguendo la coda di un file usando tail -f foo.log, voglio dire la mia barra del titolo tail -f foo.log.

Risposte:


16

Fondamentalmente, hai bisogno di:

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

alla fine del tuo .bashrco simili. Mi ci è voluto un po 'per risolverlo - vedi la mia risposta qui per maggiori informazioni :)


Grazie per questa soluzione simon! Tuttavia, quando aggiungo questo al mio .bashrcdopo ogni comando nella mia shell ottengo questo output 0;%s@%s:%s" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}. Presumo di poter sopprimere questo output assegnando il comando trap a PS1? Tuttavia, PS1=trap 'echo -ne "\033]0;$BASH_COMMAND\007"' DEBUGnon funziona. Conduce all'errore bash: echo -ne "\033]0;$BASH_COMMAND\007": command not found.
Orschiro,

A proposito, ho appena messo in campo stackoverflow.com/questions/48407130/… , chiesto presumibilmente a seguito dell'applicazione di questo consiglio. La trappola dovrebbe scrivere direttamente su stderr o sul TTY, non su stdout.
Charles Duffy,

1
@orschiro, il consiglio di eseguire il trapcomando come comando separato , di non assegnarlo a PS1.
Charles Duffy,

12

(Ispirato da questa risposta SU )

Puoi combinare un paio di trucchi bash:

  • Se si intercetta un segnale DEBUG, il gestore viene chiamato prima dell'esecuzione di ciascun comando
  • La variabile $BASH_COMMANDcontiene il comando attualmente in esecuzione

Quindi, intrappola DEBUG e chiedi al gestore di impostare il titolo su $BASH_COMMAND:

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

Ciò manterrà il titolo modificato fino a quando qualcos'altro lo cambierà, ma fino a quando il tuo $PS1 rimarrà lo stesso non sarà un problema: si avvia un comando, il gestore DEBUG cambia la barra del titolo e quando il comando termina bash disegna un nuovo prompt e reimposta nuovamente la barra del titolo.

Un suggerimento utile trovato qui (anche da dove proviene quella risposta SU) è di includere:

set -o functrace

Questo farà bash propagare la trappola DEBUG a tutti i subshells che inizi; altrimenti la barra del titolo non verrà modificata in essi


ah! stessa risposta esattamente allo stesso tempo! +1 per la gestione dei subshells, ma hai qualche risposta al problema delle pipe? (vedi il mio link alla domanda SO)
simon

Non funzionassh
abyss.7

Inoltre "uccide" il completamento in "tab"
abyss.7

A proposito, ho appena messo in campo stackoverflow.com/questions/48407130/… , chiesto presumibilmente a seguito dell'applicazione di questo consiglio. La trappola dovrebbe scrivere direttamente su stderr o sul TTY, non su stdout.
Charles Duffy,

Non sarebbe meglio reindirizzare /dev/ttyinvece di stderr?
Aaron Digulla,

2

Ho lavorato sulla mia soluzione da vari post in giro. Questo crea un titolo contenente user, hostname, pwd, tty e il comando attualmente eseguito (per bash).

Sembra così (nessun comando in esecuzione):

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

E così (eseguendo un comando):

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

Da qualche parte in .bashrc, ho esteso PS1:

# 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\]"

Aggiunge il comando corrente, usando la cronologia 1 e trap :

# 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

Sentiti libero di adottare per le tue esigenze.


A proposito, ho appena messo in campo stackoverflow.com/questions/48407130/… , chiesto presumibilmente a seguito dell'applicazione di questo consiglio. La trappola dovrebbe scrivere direttamente su stderr o sul TTY, non su stdout.
Charles Duffy,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.