12 votes

Définir le titre de la fenêtre xterm (PuTTY) lors de l'utilisation de l'écran ?

J'essaie d'obtenir screen pour définir mon xterm titre. Je l'ai fait fonctionner en dehors de screen mais screen garde le titre qui était en place quand je l'ai commencé. Voici mon .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

Et voici mon .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'

Qu'est-ce que je fais de manière incorrecte ?

Mise à jour (19 août 2010) : Le problème est que vous ne pouvez pas mettre à jour le titre du terminal à partir de l'écran lorsque vous définissez alwayslastline . Ma solution a donc été d'abandonner et de me contenter d'un titre prédéterminé, utile, pour mes sessions d'écran. Ma mise à jour .bashrc y .screenrc peut être trouvé à http://bitbucket.org/jsumners/rcfiles/src .

8voto

bwillan Points 71

En fait, il existe un moyen d'envoyer des séquences d'échappement directement à l'xterm, en passant par l'écran. Il n'a pas été facile à trouver, mais d'après le code de screen (src/ansi.c), je pense qu'il existe depuis 2005. Je l'ai fait fonctionner dans xterm, Gnome Terminal, et putty. J'ai trouvé une note dans les sources de mintty indiquant qu'il ne fonctionne pas là simplement parce qu'ils ne gèrent pas DCS (à moins que cela ait été corrigé récemment).

D'après la documentation de l'écran ci-dessous (à l'adresse 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.

L'ANSI DCS (Device Control String) est un code d'échappement utilisé pour envoyer des données directement à un terminal (je pense que c'était son but initial il y a de nombreuses années). Une telle chaîne se termine par un code d'échappement ST (String Terminator).

Enveloppez la chaîne pour définir le titre de la fenêtre du terminal à l'intérieur d'un bloc DCS..ST, et il passe par l'écran et les mises à jour correctement, même avec hardstatus alwayslastline.

SCD = \033P ST = \033\

Exemple - pour mettre à jour le titre de la fenêtre avec le répertoire de travail actuel, utilisez

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

Mieux vaut tard que jamais ! J'espère que cela aidera quelqu'un.

Juste au cas où je me tromperais sur les changements de source de l'écran : J'exécute la dernière version de screen-session git, qui à son tour utilise presque la dernière version de screen git (avec quelques changements spécifiques à screen-session). Mais les messages de log sont datés de screen 2005 (vous pouvez voir les modifications apportées à ce commit concernant la gestion du SCD si vous clonez le repo git de screen et utilisez la commande ci-dessous).

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

4voto

crb Points 7900

Les codes d'échappement sont différents à l'intérieur de l'écran .

Ceci en dehors de l'écran :

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

est équivalent à cet écran intérieur :

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

Changer votre cas ${TERM}="screen" barre de titre en

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

résoudra votre problème.

0 votes

Cela ne fonctionne pas. Je ne comprends pas pourquoi.

0 votes

J'ai déterminé que la mise en place hardstatus alwayslastline comme je le fais pour screen empêche screen de l'établissement de la xterm titre. Maintenant si je peux juste trouver comment faire les deux en même temps.

0 votes

Est-ce parce que votre hardstatus contient %t (pour titre) ?

1voto

0x89 Points 6095

Crb a en quelque sorte raison, mais

a) le code d'échappement qu'il utilise ne fonctionne pas pour moi. Il devrait être \033k au lieu de \033_ . Voir screen (1) sous "TITLES (naming windows)" . Il devrait en être ainsi :

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

b) ce type d'échappement n'est utilisé que pour définir le titre de la fenêtre d'écran. Une instance d'écran peut avoir plusieurs fenêtres, chacune d'entre elles a un nom, c'est ce qui est affiché dans le champ hardstatus y caption avec le t séquence d'échappement.

c) l'échappement normal de bash fonctionne si vous définissez le bon terminfo pour xterm dans .screenrc :

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

(ceci aussi works on my machine pour le mastic)

Donc, afin de définir le bon titre à la fois pour la fenêtre d'écran et le titre de putty/xterm, j'utilise quelque chose comme :

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

pour référence : http://tldp.org/HOWTO/Bash-Prompt-HOWTO/x395.html

1voto

grwlf Points 111

Je ne vais pas répondre complètement à la question, mais laissez-moi vous suggérer la manière de résoudre le problème. De nombreux gestionnaires de fenêtres prennent en charge EWMH spécification. Il existe également un outil en ligne de commande wmctrl qui est capable d'interagir avec eux. En utilisant cet outil, on peut facilement changer le titre de la fenêtre active avec la commande suivante :

  wmctrl -r :ACTIVE: -T "FooTitle"

Il est également possible de modifier l'icône de la fenêtre, sa disposition et d'autres propriétés. L'outil ne fonctionnera probablement pas pour PuTTY puisque Windows ne prend pas en charge EWMH, mais la plupart des systèmes Linux devraient l'accepter.

Avec cette méthode, il n'est pas important de savoir si vous utilisez screen ou pas.

0voto

Ces deux dernières semaines, j'ai cherché dans de nombreux forums et je n'ai pas trouvé la réponse à cette question :

Comment obtenir la sortie de toutes les commandes dans le titre de Putty ?

J'en avais besoin pour que d'autres programmes sachent quand certains travaux sur un serveur sont terminés et s'ils sont bien ou mal faits. Plink stdout et stdin ne fonctionnait pas, j'ai utilisé de nombreux ajustements avec des délais d'attente et pour certaines commandes qui fonctionnaient pour d'autres pas. XSEL et XCLIP ne pouvaient pas être installés sur ce serveur.

Voici donc la solution :

  1. Obtenir la sortie de la commande dans un fichier.
  2. Faites écho de ce fichier au titre.

Sur le client putty et le serveur suse, cela ressemble à ceci :

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

Espérons que quelqu'un pourra s'en servir. Bien sûr, cela ne fonctionnera pas pour tous les types de serveurs et tous les paramètres du client Putty, mais l'idée devrait bien fonctionner.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X