Problème PS1, gâcher CLI

16

J'ai fait une simple mission PS1

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

Tout ce que je voulais faire, c'était changer la couleur de l'invite et n'afficher que le chemin relatif. Cependant, cela gâche la CLI. Par exemple, lorsque vous parcourez l'historique avec le recadrage informatique et chevauche l'affichage. Lorsque je tape une commande longue, le curseur se déplace au début de l'écran en se chevauchant avec l'invite elle-même. Qu'est ce que j'ai mal fait?

yayu
la source

Réponses:

30

C'est parce que bash pense que l'invite est plus longue qu'elle ne l'est. La séquence d'échappement \e[0;31mpar exemple, est aspirée par le terminal, qui à son tour transforme le texte suivant en 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 l' introduction du BashFAQ 53 et des codes de terminal (ANSI / VT100) pour plus d'informations.

geirha
la source
1
Merci pour votre description parfaite J'ai eu ce problème plusieurs fois et je ne sais jamais où était le problème.
Betlista
+1, même ici. Pour ceux qui tester aveuglément cette solution et il ne fonctionne pas, il convient de mentionner ici qu'il ya une autre syntaxe décrite dans le lien BashFAQ pour échapper à des couleurs dans les fonctions, \001 \002.
Stephen Niedzielski