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.