web-dev-qa-db-fra.com

Problème PS1, problème de CLI

J'ai fait une simple mission sur PS1

PS1="\e[0;31m[\W]\$ \e[m "

Tout ce que je voulais faire était de changer la couleur de l'invite et d'afficher uniquement le chemin relatif. Cependant, cela dérange la CLI. Par exemple, lorsque vous parcourez l’historique avec le , il coupe et chevauche l’affichage. Lorsque je tape une commande longue, le curseur se déplace au début de l'écran, ce qui se chevauche avec l'affichage de l'invite. Qu'est ce que j'ai mal fait?

16
yayu

C'est parce que bash pense que l'invite est plus longue qu'elle ne l'est. La séquence d'échappement \e[0;31m, par exemple, est aspirée par le terminal, qui à son tour rend le texte suivant rouge, mais bash ne le sait pas. Donc, vous devez dire à bash que cette séquence de caractères ne doit pas être comptée dans la longueur de l'invite, et vous le faites en l'enfermant dans \[ \]. Je recommande également d'utiliser tput au lieu de coder en dur les séquences d'échappement des terminaux.

red=$(tput setaf 1)
reset=$(tput sgr0)
PS1='\[$red\][\W]\$\[$reset\] '

Voir BashFAQ 5 et Introduction aux codes de terminal (ANSI/VT100) pour plus d'informations.

30
geirha