Terminal GNOME - nom du processus dans le titre de l'onglet

9

Comment puis-je mettre le nom du processus en cours d'exécution dans un titre d'onglet Terminal GNOME (ou dans la barre de titre lorsqu'il n'y a qu'un seul onglet)?

-- MISE À JOUR --

Pour clarifier, je veux que le titre de l'onglet soit mis à jour lorsque j'exécute un processus, par exemple:

# 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"
la pureté
la source

Réponses:

8

Je l'ai trouvé. Ce site fournit une bonne explication d'une solution.
Dans votre bashrc, cela ressemblerait à:

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

Personnellement, je ne pense pas que je l'ajouterais à mon bashrc, car le DEBUG combiné avec trace jette une charge de déchets lorsque tout votre shell démarre. Si vous pouvez vivre avec ça, ça marche vraiment. Cependant, il affiche l'intégralité de la commande, pas seulement le premier mot.

DaveParillo
la source
2
Merci d'avoir posé une bonne question. Cela ressemblait à une question simple au début ... Après les 10 premières minutes, ça commençait à me rendre fou! C'est pourquoi je pensais que c'était une bonne question - cela semble simple, mais m'a forcé à approfondir l'interaction entre le shell, le terminal et les signaux.
DaveParillo,
pourquoi l' PS1affectation? cela me donne du charabia, et cela ne semble pas vraiment nécessaire ici ...?
phil294
Juste des erreurs pour moi.
Kzqai
4

Eh bien, comme tout le monde semble déjà connaître la solution de David Pashley, je suis un peu surpris qu'il m'a fallu si longtemps pour trouver celle-ci car elle est presque aussi vieille.

Cette solution prend réellement en charge les ordures de spam de fin d'achèvement.

Pour être clair: je n'ai rien fait ici seul, sauf des recherches. Tout le mérite revient à Marius Gedminas .

Cela fonctionne parfaitement pour moi avec 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

C'est aussi un cross-post parce que je viens de le découvrir et que je voulais partager et je pense que c'est utile ici aussi.

Communauté
la source
2

Ce qui suit devrait fonctionner. J'ai la fonction dans un .bash_functionsfichier et je la source dans le .bashrcfichier avant le réglage $PROMPT_COMMAND.

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

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

la source
1
Tu es proche, mais je n'ai pas beaucoup mieux. Cela vous donnera la dernière commande exécutée , mais pas vraiment ce qu'est l'adurity. Je pensais simplement changer term_title en: `if [jobs]; puis l'histoire 1 | awk '{print $ 2}'; sinon echo -ne 'bash em' fi` fonctionnerait, mais il est incohérent d'attraper des processus avec des durées de vie courtes et il ne revient toujours pas lorsque le processus est terminé. Je ne connais pas le fonctionnement interne de xterm pour savoir comment jouer avec ces déclencheurs / événements.
DaveParillo
bash exécute $ PROMPT_COMMAND juste avant d'afficher l'invite, c'est donc le mieux que je puisse faire avec cette approche. Il peut y avoir d'autres déclencheurs qui peuvent s'exécuter juste après avoir appuyé sur Entrée, mais je ne les connais pas.
2

dans zsh vous définissez simplement votre fonction 'precmd'. voir ici .

akira
la source