Назад | Перейти на главную страницу

Установить заголовок окна xterm (PuTTY) при использовании экрана?

Я пытаюсь получить screen установить мой xterm заглавие. У меня это работает вне screen, но screen сохраняет то название, которое было на месте, когда я его начал. Вот мой .bashrc:

function bash_prompt_command() {
    # How many characters of the $PWD should be kept
    local pwdmaxlen=25
    # Indicate that there has been dir truncation
    local trunc_symbol=".."
    local dir=${PWD##*/}
    pwdmaxlen=$(( ( pwdmaxlen < ${#dir} ) ? ${#dir} : pwdmaxlen ))
    NEW_PWD=${PWD/#$HOME/\~}
    local pwdoffset=$(( ${#NEW_PWD} - pwdmaxlen ))
    if [ ${pwdoffset} -gt "0" ]
    then
        NEW_PWD=${NEW_PWD:$pwdoffset:$pwdmaxlen}
        NEW_PWD=${trunc_symbol}/${NEW_PWD#*/}
    fi

    export NEW_PWD
}

PROMPT_COMMAND=bash_prompt_command
# Color chart @ http://wiki.archlinux.org/index.php/Color_Bash_Prompt
case "${TERM}" in
    "xterm")
        TITLEBAR='\[\033]0;\u@\h > ${NEW_PWD}\007\]'
        PS1="${TITLEBAR}\[\e[1;32m\][\e[0;36m\]\u\e[1;32m\]@\e[1;33m\]\h\e[1;32m\]] \e[0;37m\]\${NEW_PWD}/ \e[1;32m\]\$ \[\e[0m"
        ;;
    "screen")
        TITLEBAR='\[\033]0;\u@\h > ${NEW_PWD}\007\]'
        ESC='\[\ek\e\\\]'
        PS1="${TITLEBAR}\[\e[1;32m\][\e[0;36m\]\u\e[1;32m\]] \e[0;37m\]\${NEW_PWD}/ \e[1;32m\]\$ ${ESC}\[\e[0m"
        ;;
    *)
        PS1="\[\e[1;32m\][\e[0;36m\]\u\e[1;32m\]@\e[1;33m\]\h\e[1;32m\]] \e[0;37m\]\${NEW_PWD}/ \e[1;32m\]\$ \[\e[0m"
    ;;
esac

И вот мой .screenrc:

hardstatus alwayslastline
hardstatus string '%{= kg}[%{Y}%H%{g}][%= %{= kw}%?%-Lw%?%{=b kR}(%{W}%n-%t%?(%u)%?%{=b kR})%{= kw}%?%+Lw%?%?%= %{g}][%{Y}%l%{g}]%{g}[%{B}%m.%d.%Y %{G}%c%{g}]'

termcapinfo xterm|xterms|xs|rxvt ti@:te@
termcapinfo xterm 'hs:ts=\E]2;:fs=\007:ds=\E]2;screen\007'

altscreen on
shelltitle '$ |bash'

Что я делаю неправильно?

Обновление (19 августа 2010 г.): Проблема в том, что вы не можете обновить заголовок терминала изнутри экрана, когда вы устанавливаете alwayslastline. Так что моим решением было просто сдаться и согласиться на заранее определенный полезный заголовок для моих сеансов экрана. Мой обновленный .bashrc и .screenrc можно найти на http://bitbucket.org/jsumners/rcfiles/src.

На самом деле, есть способ отправлять escape-последовательности непосредственно в xterm, проходя через screen. Его было нелегко найти, но, судя по экранному коду (src / ansi.c), я думаю, что он существует с 2005 года. У меня он работает в xterm, Gnome Terminal и putty. Я нашел примечание в источнике mintty, указывающее, что он там не работает просто потому, что они не обрабатывают DCS (если он не был исправлен недавно).

Из документации к экрану ниже (по адресу http://www.gnu.org/software/screen/manual/html_node/Control-Sequences.html )

ESC P (A) Device Control String
          Outputs a string directly to the host terminal without interpretation.

ANSI DCS (Device Control String) - это escape-код, который используется для отправки непосредственно на терминал (я думаю, что это было его первоначальной целью много лет назад). Такая строка заканчивается escape-кодом ST (терминатор строки).

Оберните строку, чтобы установить заголовок окна терминала внутри блока DCS..ST, и он пройдет через экран и обновится правильно, даже при hardstatus alwayslastline.

DCS = \ 033P, ST = \ 033 \

Пример - чтобы обновить заголовок окна текущим рабочим каталогом, используйте

NEW_TITLE="\033]0;${PWD/$HOME/~}\007"
echo -ne "\033P${NEW_TITLE}\033\\"

Лучше поздно, чем никогда! Надеюсь, это кому-то поможет.

На всякий случай я ошибаюсь насчет изменений источника экрана: я запускаю последнюю версию git из screen-session, которая, в свою очередь, использует почти последнюю версию screen-session (с некоторыми изменениями, характерными для screen-session). Но сообщения журнала датированы экраном 2005 года (вы можете увидеть изменения, внесенные в этот коммит относительно обработки DCS, если клонируете репозиторий экрана git и используете команду ниже).

git clone git://git.savannah.gnu.org/screen.git
git difftool e6618a14^! src/ansi.c

Коды выхода на экране разные.

Это за пределами экрана:

PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME}: ${PWD}\007"'

эквивалентно этому внутреннему экрану:

PROMPT_COMMAND='echo -ne "\033_${USER}@${HOSTNAME}: ${PWD}\033\\"'

Измените заголовок регистра $ {TERM} = "screen" на

TITLEBAR='\[\033_\u@\h > ${NEW_PWD}\033\\\]'

решит вашу проблему.

crb вроде как правильно, но

а) escape-код, который он использует, мне не подходит. Так должно быть \033k вместо того \033_. Видеть screen (1) под "TITLES (naming windows)". Так и должно быть:

PROMPT_COMMAND='echo -ne "\033k${USER}@${HOSTNAME}: ${PWD}\033\\"'

б) этот вид экранирования используется только для установки заголовка экранного окна. Один экземпляр экрана может иметь несколько окон, каждое из которых имеет имя, то есть то, что отображается в hardstatus и caption с t escape-последовательность.

c) нормальное экранирование bash работает, если вы установите правильный terminfo для xterm в .screenrc:

termcapinfo xterm 'hs:ts=\E]2;:fs=\007:ds=\E]2;screen\007'

(это также works on my machine для шпатлевки)

Итак, чтобы установить правильный заголовок как для экранного окна, так и для заголовка putty / xterm, я использую что-то вроде:

XTERM_TITLE="${USER}@${HOSTNAME}: ${PWD}"
SCREEN_TITLE="${PWD}"
PROMPT_COMMAND='echo -ne "\033]0;$XTERM_TITLE\007\033k$SCREEN_TITLE\033\\"'

для справки: http://tldp.org/HOWTO/Bash-Prompt-HOWTO/x395.html

Я не собираюсь отвечать на этот вопрос полностью, но позвольте предложить способ решения проблемы. Многие оконные менеджеры поддерживают EWMH Технические характеристики. Также есть инструмент командной строки wmctrl который может с ними взаимодействовать. Используя этот инструмент, можно легко изменить заголовок активного окна с помощью следующей команды:

  wmctrl -r :ACTIVE: -T "FooTitle"

Также можно изменить значок окна, макет и другие свойства. Инструмент, вероятно, не будет работать для PuTTY, поскольку Windows не поддерживает EWMH, но большинство систем Linux должны его принять.

При использовании этого метода не имеет значения, используете ли вы screen или не.

Последние 2 недели я искал много форумов и не нашел ответа на вопрос:

Как получить весь вывод команды в заголовке Putty?

Требовалось, чтобы другие программы знали, когда какие-то задания на сервере выполнены, правильно или неправильно. Plink stdout и stdin не работали, я использовал много настроек с задержками ожидания и для некоторых команд, которые не работали для других. XSEL и XCLIP не могут быть установлены на этом сервере.

Итак, вот решение:

  1. Получить вывод команды в файл.
  2. Переведите этот файл в заголовок.

На клиенте putty и сервере suse это выглядит так:

ls /home | grep domagaja > logutoit.txt 
echo -e "\033]0\\;$(cat logutoit.txt)\\007\\c"

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