Terminale GNOME - nome del processo nel titolo della scheda


9

Come posso inserire l'attuale nome del processo in esecuzione in un titolo della scheda Terminale GNOME (o barra del titolo quando c'è solo una scheda)?

-- AGGIORNARE --

Per chiarire, desidero aggiornare il titolo della scheda quando eseguo un processo, ad esempio:

# title is currently "bash"
$ find / -name foo # while searching for foo, title is "find"
$ # title is once again "bash"
$ less /proc/cpuinfo # title changes to "less"
$ man ls # title changes to man
$ # title returns to "bash"

Risposte:


8

Trovato. Questo sito fornisce una buona spiegazione di una soluzione.
Nel tuo bashrc, sembrerebbe:

case "$TERM" in
xterm*|rxvt*)
    set -o functrace
    trap 'echo -ne "\e]0;$BASH_COMMAND\007"' DEBUG
    PS1="\e]0;\s\007$PS1"
    ;;
*)
    ;;
esac

Personalmente, non penso che lo aggiungerei al mio bashrc, perché il DEBUG combinato con la traccia getta un carico di immondizia quando inizia tutta la tua shell. Se riesci a conviverci, funziona davvero. Visualizza l'intero comando, tuttavia, non solo la prima parola.


2
Grazie per aver fatto una buona domanda. All'inizio sembrava una domanda semplice ... Dopo i primi 10 minuti, stava iniziando a farmi impazzire! Ecco perché ho pensato che fosse una buona domanda: sembra semplice, ma mi ha costretto a imparare qualcosa di più profondo sull'interazione tra shell, terminale e segnali.
DaveParillo,

perché l' PS1assegnazione? si traduce in un po 'di disinvoltura per me e non sembra davvero necessario qui ...?
phil294,

Solo errori per me.
Kzqai,

4

Bene, dal momento che tutti sembrano già conoscere la soluzione di David Pashley, sono abbastanza sorpreso che mi ci è voluto così tanto tempo per trovarlo perché è quasi altrettanto vecchio.

Questa soluzione in realtà si occupa della spazzatura spamming a completamento bash.

Per essere chiari: qui non ho fatto altro da solo se non la ricerca. Tutto il merito va a Marius Gedminas .

Questo funziona perfettamente per me con Gnome-Terminal / Terminator

# If this is an xterm set the title to user@host:dir
case "$TERM" in
xterm*|rxvt*)
    PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME}: ${PWD}\007"'

    # Show the currently running command in the terminal title:
    # http://www.davidpashley.com/articles/xterm-titles-with-bash.html
    show_command_in_title_bar()
    {
        case "$BASH_COMMAND" in
            *\033]0*)
                # The command is trying to set the title bar as well;
                # this is most likely the execution of $PROMPT_COMMAND.
                # In any case nested escapes confuse the terminal, so don't
                # output them.
                ;;
            *)
                echo -ne "\033]0;${USER}@${HOSTNAME}: ${BASH_COMMAND}\007"
                ;;
        esac
    }
    trap show_command_in_title_bar DEBUG
    ;;
*)
    ;;
esac

Anche questo è un cross-post perché l'ho appena scoperto e volevo condividere e penso che sia utile anche qui.


2

Di seguito dovrebbe funzionare. Ho la funzione in un .bash_functionsfile e sorgente nel .bashrcfile prima dell'impostazione $PROMPT_COMMAND.

function term_title
{
        history 1 | awk '{print $2}';
}

PROMPT_COMMAND='echo -ne "\033]0;"$(term_title)"\007"'

1
Sei vicino, ma non ho molto meglio. Questo ti darà l' ultimo comando eseguito , ma non proprio quello che segue l'adurezza. Ho pensato di cambiare term_title in: `if [jobs]; quindi la storia 1 | awk '{print $ 2}'; else echo -ne 'bash em' fi` funzionerebbe, ma è incoerente nel catturare i processi con brevi periodi di vita e al termine del processo non torna indietro. Non conosco il funzionamento interno di xterm per sapere come pasticciare con quei trigger / eventi.
DaveParillo,

bash esegue $ PROMPT_COMMAND appena prima di visualizzare il prompt, quindi questo è il massimo che posso fare con questo approccio. Potrebbero esserci altri trigger che possono essere eseguiti subito dopo aver premuto Invio, ma non li conosco.

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.