GNOME Terminal - имя процесса в заголовке вкладки


9

Как я могу поместить имя текущего запущенного процесса в заголовок вкладки Терминала GNOME (или строку заголовка, когда есть только одна вкладка)?

-- ОБНОВИТЬ --

Чтобы уточнить, я хочу, чтобы заголовок вкладки обновлялся при запуске процесса, например:

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

Ответы:


8

Нашел это. Этот сайт дает хорошее объяснение решения.
В вашем bashrc это будет выглядеть так:

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

Лично я не думаю, что я бы добавил его в свой bashrc, потому что DEBUG в сочетании с trace действительно выбрасывает мусор при запуске всей вашей оболочки. Если вы можете жить с этим, это действительно работает. Тем не менее, он отображает всю команду, а не только первое слово.


2
Спасибо, что задали хороший вопрос. Сначала это выглядело как простой вопрос ... После первых 10 минут он начинал сводить меня с ума! Вот почему я подумал, что это хороший вопрос - звучит просто, но заставил меня узнать что-то более глубокое о взаимодействии оболочки, терминала и сигналов.
DaveParillo

почему - PS1назначение? это приводит к бреду для меня, и это действительно не кажется необходимым здесь ...?
phil294

Просто ошибки для меня.
Kzqai

4

Ну, так как, кажется, все уже знают решение Дэвида Пашли, я немного удивлен, что мне понадобилось так много времени, чтобы найти это, потому что оно почти такое же старое.

Это решение на самом деле заботится о спам-мусоре с завершением bash.

Чтобы было ясно: я ничего не делал здесь самостоятельно, кроме исследований. Вся заслуга Мариуса Гедминаса .

Это прекрасно работает для меня с 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

Также это кросс-пост, потому что я только что узнал об этом и хотел поделиться, и я думаю, что это также полезно здесь.


2

Ниже должно работать. У меня есть функция в .bash_functionsфайле, и источник ее в .bashrcфайле перед установкой $PROMPT_COMMAND.

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

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

1
Ты рядом, но мне не намного лучше. Это даст вам последнюю выполненную команду, но не совсем то, что за адрютом следует. Я подумал просто изменить term_title на: `if [jobs]; тогда история 1 | awk '{print $ 2}'; иначе echo -ne 'bash em' fi` сработает, но это несовместимо с перехватом процессов с коротким сроком службы и по-прежнему не переключается обратно после завершения процесса. Я не знаю о внутреннем функционировании xterm, чтобы знать, как связываться с этими триггерами / событиями.
DaveParillo

bash выполняет $ PROMPT_COMMAND непосредственно перед отображением приглашения, так что это лучшее, что я могу сделать с этим подходом. Могут быть и другие триггеры, которые могут сработать сразу после нажатия Enter, но я о них не знаю.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.