Commande d'affichage dans la barre de titre xterm


23

My Bash Prompt définit actuellement la barre de titre xterm en utilisant la séquence suivante:

PS1='\033]0;\u@\h>\w\007'

Existe-t-il un moyen simple d'afficher la commande actuelle dans la barre de titre. Par exemple, si je suis en train de suivre un fichier en utilisant tail -f foo.log, je veux que ma barre de titre dise tail -f foo.log.

Réponses:


16

Fondamentalement, vous avez besoin de:

trap 'printf "\033]0;%s\007" "${BASH_COMMAND//[^[:print:]]/}"' DEBUG

à la fin de votre .bashrcou similaire. Cela m'a pris un certain temps pour résoudre ce problème - voir ma réponse ici pour plus d'informations :)


Merci pour cette solution simon! Cependant, lorsque j'ajoute cela à ma .bashrccommande après chaque commande dans mon shell, j'obtiens cette sortie 0;%s@%s:%s" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}. Je suppose que je peux supprimer cette sortie en affectant la commande trap à PS1? Cependant, PS1=trap 'echo -ne "\033]0;$BASH_COMMAND\007"' DEBUGne fonctionne pas. Cela conduit à l'erreur bash: echo -ne "\033]0;$BASH_COMMAND\007": command not found.
— orschiro

BTW, je viens de mettre stackoverflow.com/questions/48407130/… , a-t-il demandé, probablement à la suite de l'application de ces conseils. Le piège doit écrire directement sur stderr ou sur le TTY, pas sur stdout.
— Charles Duffy

1
@orschiro, le conseil d'exécuter la trapcommande en tant que commande distincte , de ne pas l'affecter à PS1.
— Charles Duffy

12

(Inspiré par cette réponse SU )

Vous pouvez combiner quelques astuces bash:

  • Si vous interceptez un signal DEBUG, le gestionnaire est appelé avant l'exécution de chaque commande
  • La variable $BASH_COMMANDcontient la commande en cours d'exécution

Alors, piègez DEBUG et demandez au gestionnaire de définir le titre sur $BASH_COMMAND:

trap 'printf "\033]0;%s\007" "${BASH_COMMAND//[^[:print:]]/}" >&2' DEBUG

Cela gardera le titre modifié jusqu'à ce que quelque chose d'autre le change, mais tant que votre $PS1reste le même, ce ne sera pas un problème - vous démarrez une commande, le gestionnaire DEBUG change la barre de titre, et lorsque la commande se termine bash dessine un nouveau invite et réinitialise à nouveau votre barre de titre.

Un conseil utile trouvé ici (également d'où vient cette réponse SU) est d'inclure:

set -o functrace

Cela fera bash propager le piège DEBUG à tous les sous-shell que vous démarrez; sinon la barre de titre n'y sera pas modifiée


Ha! même réponse exactement en même temps! +1 pour la gestion des sous-coquilles, mais avez-vous une réponse au problème des tuyaux? (voir mon lien vers la question SO)
— simon

Ne fonctionne passsh
— abyss.7

Également "tue" l'achèvement sur "tab"
— abyss.7

BTW, je viens de mettre stackoverflow.com/questions/48407130/… , a-t-il demandé, probablement à la suite de l'application de ces conseils. Le piège doit écrire directement sur stderr ou sur le TTY, pas sur stdout.
— Charles Duffy

Ne serait-il pas préférable de rediriger vers /dev/ttyau lieu de stderr?
— Aaron Digulla

2

J'ai travaillé autour de ma propre solution à partir de divers postes. Cela crée un titre contenant l'utilisateur, le nom d'hôte, pwd, tty et la commande actuellement exécutée (pour bash).

Cela ressemble à ceci (aucune commande en cours d'exécution):

.:[user@hostname:/home/user][pts/10]:.

Et comme ça (exécuter une commande):

.:[user@hostname:/home/user][pts/10] {tail -F /var/log/syslog}:.

Quelque part dans le .bashrc, j'ai étendu PS1:

# set the terminals title. This is the "post-command" part,
# need to use a trap for pre-command (to add the command line to the title)
PS1+="\[\033]2;.:[\u@\h:\$PWD] [$(tty | cut -b 6-)]:.\007\]"

Ajoute la commande actuelle, en utilisant l' historique 1 et l' interruption :

# set a fancy title (this is pre-command, in PS1 is after-command (to reset command)
trap 'echo -ne "\033]2;.:[${USER}@${HOSTNAME}:${PWD}] [$(tty | cut -b 6-)] {$(history 1 | sed "s/^[ ]*[0-9]*[ ]*//g")}:.\007"' DEBUG

N'hésitez pas à vous adapter à vos besoins.


BTW, je viens de mettre stackoverflow.com/questions/48407130/… , a-t-il demandé, probablement à la suite de l'application de ces conseils. Le piège doit écrire directement sur stderr ou sur le TTY, pas sur stdout.
— Charles Duffy
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.