GNOME Terminal - nazwa procesu w tytule karty

9

Jak mogę umieścić bieżącą nazwę uruchomionego procesu w tytule karty Terminal GNOME (lub pasku tytułu, gdy jest tylko jedna karta)?

-- AKTUALIZACJA --

Aby to wyjaśnić, chcę, aby tytuł karty był aktualizowany po uruchomieniu procesu, na przykład:

# 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"
przyczepność
źródło

Odpowiedzi:

8

Znaleziono to. Ta strona zawiera dobre wyjaśnienie rozwiązania.
W twoim bashrc wyglądałoby to tak:

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

Osobiście nie sądzę, żebym dodał go do mojego bashrc, ponieważ DEBUG w połączeniu ze śledzeniem wyrzuca mnóstwo śmieci, gdy zaczyna się cała twoja powłoka. Jeśli możesz z tym żyć, to faktycznie działa. Wyświetla jednak całe polecenie, ale nie tylko pierwsze słowo.

DaveParillo
źródło
2
Dziękuję, że zadałeś dobre pytanie. Na początku wyglądało to na proste pytanie ... Po pierwszych 10 minutach zaczęło mnie doprowadzać do szału! Dlatego pomyślałem, że to dobre pytanie - brzmi prosto, ale zmusiło mnie do nauczenia się czegoś głębszego na temat interakcji między powłoką, terminalem i sygnałami.
DaveParillo
dlaczego PS1przeniesienie? skutkuje to dla mnie sflaczałością i naprawdę nie wydaje się tutaj konieczna ...?
phil294
Tylko błędy dla mnie.
Kzqai
4

Cóż, skoro wszyscy już znają rozwiązanie Davida Pashleya, jestem trochę zaskoczony, że znalezienie go zajęło mi tyle czasu, ponieważ jest prawie tak stary.

To rozwiązanie faktycznie zajmuje się śmieciami związanymi z kończeniem bashu.

Żeby było jasne: nie zrobiłem tu nic poza badaniami. Wszystkie zasługi należą się Mariusowi Gedminasowi .

Działa to dla mnie idealnie z 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

Jest to również post, ponieważ właśnie się o tym dowiedziałem i chciałem się nim podzielić, i myślę, że jest to również przydatne tutaj.

Społeczność
źródło
2

Poniższe powinno działać. Mam funkcję w .bash_functionspliku i .bashrcprzed ustawieniem źródła w pliku $PROMPT_COMMAND.

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

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

źródło
1
Jesteś blisko, ale nie mam nic lepszego. To da ci ostatnie wykonane polecenie, ale nie tak naprawdę, po co ma być dbałość. Pomyślałem, że zmieniłem term_title na: `if [jobs]; potem historia 1 | awk '{print 2 USD}'; inaczej echo -ne 'bash em' fi 'działałoby, ale jest niespójne w wychwytywaniu procesów o krótkim czasie życia i nadal nie przełącza się z powrotem po zakończeniu procesu. Nie wiem o wewnętrznych działaniach Xterm, aby wiedzieć, jak zadzierać z tymi wyzwalaczami / zdarzeniami.
DaveParillo
bash wykonuje $ PROMPT_COMMAND tuż przed wyświetleniem monitu, więc jest to najlepsze, co mogę zrobić z tym podejściem. Mogą istnieć inne wyzwalacze, które mogą zostać wykonane zaraz po wciśnięciu Enter, ale ich nie znam.
2

w zsh po prostu definiujesz swoją funkcję „precmd”. patrz tutaj .

akira
źródło