Можно ли получить текущее имя окна xterm?


9

Это LDP Howto демонстрирует, как изменить заголовок xterm.

Я знаю, что это также возможно с помощью xtitleкоманды.

Прежде чем вызывать длительное действие, мой сценарий использует такие методы, чтобы изменить заголовок своего окна xterm.

Я хотел бы извлечь имя окна xterm до его изменения, чтобы после завершения продолжительного действия я мог восстановить заголовок к его предыдущему значению.

Это было бы как бы обратное к xtitle ... Возможно ли это вообще?


Связанный вопрос stackoverflow . Похоже, xtermесть стек для заголовка окна, если вы можете понять, как его использовать.
jw013

Ответы:


4

Используйте xtitleскрипт.

Есть много вариантов в Интернете, однако я склонен использовать один, который зависит от xprop

http://www.shelldorado.com/scripts/cmds/xtitle


Отлично! Это именно то, на что я надеялся ... и это работает не только для xterm, но (в отличие от других решений) также работает для gnome-терминала. Благодарю вас!
TheGeeko61

Обратите внимание, что получение заголовка по протоколу X, что и xtitleработает, работает только для локальных сессий.
ak2

9

Существует контрольная последовательность для запроса текущего заголовка, но она обычно отключена из соображений безопасности. Это потому, что он позволяет вредоносной программе или даже просто текстовому файлу вставлять произвольные последовательности символов, как будто они набраны на клавиатуре, сначала устанавливая заголовок, а затем запрашивая ответ. Следовательно, был введен стек заголовков.

Следующая команда сохранит текущее окно и заголовки значков в стеке:

echo -ne '\e[22t'

Это установит заголовок на my title:

echo -ne '\e]0;my title\007'

И это восстановит предыдущие названия окон и значков:

echo -ne '\e[23t'

2

Для тривиального (и, вероятно, наиболее распространенного случая), где можно запросить приглашение для текущего xterm, просто используйте xprop -id $WINDOWID WM_NAME. Если вы хотите извлечь значение для манипуляции в сценарии оболочки, вы можете сделать что-то более дорогое, например:

   curtitle=`xprop -id $WINDOWID WM_NAME|awk '{print $3}'|xargs echo`

Используя только bash (чтобы избежать вызова awk и xargs):

   curtitle=`xprop -id $WINDOWID WM_NAME`
   curtitle=`eval echo ${x##*=}`

Xargs echo в первом примере и eval во втором примере просто для того, чтобы убрать кавычки, которые xprop помещает вокруг значения.

Замените WM_NAME на WM_ICON, если вы хотите получить имя иконки, а не строку в строке заголовка.


-1

Если я правильно понимаю ваш вопрос, вы сможете получить текущий заголовок xterm, проверив $PROMPT_COMMANDпеременную, например:

$ echo $PROMPT_COMMAND 
printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"

и вы можете установить его как (перевод строки для удобства чтения):

PROMPT_COMMAND=${PROMPT_COMMAND:+$PROMPT_COMMAND; }'printf "\033]\
0;%s@%s%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"'

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

Это не будет работать в тех случаях, когда другие приложения устанавливают заголовок.
TheGeeko61

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