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.

dogbane
la source

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 :)

Simon
la source
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

Michael Mrozek
la source
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.

Alejandro Alanis
la source
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