Prompt bash : couleurs, titre de fenêtre et non-retour à la ligne
Posted by Daniel on 20 Juil 2009 at 09:00 | Tagged as: solaris
Comme d'habitude, en changeant d'entreprise, j'ai encore oublié d'embarquer mon vieux .bashrc. Ce n'est pas bien méchant à refaire, mais, comme à chaque fois, je suis obligé de rechercher pourquoi le retour à la ligne ne se fait pas correctement dans mon terminal dès lors que je mets des couleurs. Voilà donc un petit mémo qui me servira probablement la prochaine fois que je changerai d'environnement!
Prenons le prompt suivant :
$ export PS1="\u@\e[31m\h\e[0m\$ " daniel@chaos$
Bien que non visible sur ce post pour des raisons de complexité de mise en page de WordPress, la couleur est mise sur le nom du système (indiqué ici par le \h) en passant une chaîne de contrôle du terminal : \e[31m. Dans notre cas, le 31 correspond à la couleur rouge. On donne ensuite l'instruction au terminal de supprimer la mise en forme avec la chaîne \e[0m.
Si je tape une ligne trop longue, au lieu de passer à la ligne, ce que je saisis va "manger" mon prompt :
aaaiel@chaos$ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIl s'agit en fait d'un problème de comptage de caractères au niveau de bash, qui s'y perd avec nos codes couleurs. Pour corriger le problème, il suffit de placer nos couleurs entre \[ et \] pour indiquer à bash que ce ne sont pas des caractères imprimables :
daniel@chaos$ export PS1="\u@\[\e[31m\]\h\[\e[0m\]\$ " daniel@chaos$ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaa
Et là, grande magie, ça marche bien!
Et puisqu'on parle de caractères de contrôle dans le prompt bash, j'aime bien également afficher dans la barre de titre de la fenêtre le nom de l'utilisateur et de la machine sur laquelle je suis. C'est assez pratique quand on a beaucoup de fenêtres et qu'on saute d'un serveur à l'autre, car cela présente l'avantage de se mettre à jour dès que votre prompt est affiché, autrement dit, dès la connexion sur une nouvelle machine, le titre se met à jour.
daniel@chaos$ export PS1="\[\033]0;\u@\h\007\]\u@\[\e[31m\]\h\[\e[0m\]\$ "
Cette fois-ci, on encadre toute la séquence associée au titre par \[ et \]. Cette séquence commence par \033]0; et se termine par \007. J'ai choisi d'afficher \u@\h (user@host), mais vous pouvez bien sûr y mettre ce que vous voulez. Notez que ça marche très bien avec des clients SSH sous Windows comme PuTTY.
Pour approfondir les possibilités du prompt de bash, je vous recommande également cette page sur le wiki Archlinux.