Gilles a identifié votre problème principal, mais je voulais essayer de l'expliquer différemment.
Bash interprète l' invite spéciale s'échappe uniquement avant de développer les variables de l'invite. Cela signifie que l'utilisation \e
d'une variable développée à partir de l'invite ne fonctionne pas, même si elle fonctionne directement dans PS1
.
Par exemple, cela fonctionne comme prévu et donne du texte rouge:
PS1='\e[1;31m this is in red '
Mais ce n'est pas le cas, cela met simplement un littéral \e
dans l'invite:
RED='\e[1;31m'
PS1="$RED not in red "
Si vous souhaitez stocker les échappements de couleur dans des variables, vous pouvez utiliser ANSI-C quoting ( $'...'
) pour mettre un caractère d'échappement littéral dans la variable.
Pour ce faire, vous pouvez changer votre définition GREEN
, RED
et NONE
, de sorte que leur valeur est la séquence d'échappement réelle.
GREEN=$'\033[1;32m'
RED=$'\033[1;31m'
NONE=$'\033[m'
Si vous faites cela, votre premier PS1
avec les guillemets simples devrait fonctionner:
PS1='${RED}\h $(get_path) ${exitStatus}${NONE} '
Cependant, vous aurez alors un deuxième problème.
Essayez d'exécuter cela, puis appuyez sur Up Arrow, puis Home, et votre curseur ne reviendra pas au début de la ligne.
Pour résoudre ce problème, modifiez PS1
pour inclure \[
et \]
autour des séquences d'échappement de couleur, par exemple
PS1='\[${RED}\]\h $(get_path) $?\[${NONE}\] '
Vous ne pouvez pas l'utiliser get_exit_status
correctement ici, car sa sortie contient à la fois des caractères d'impression (le code de sortie) et des caractères non imprimables (les codes de couleur), et il n'y a aucun moyen de le marquer correctement dans l'invite. Le mettre \[...\]
le marquerait comme non imprimable en entier, ce qui n'est pas correct. Vous devrez modifier la fonction afin qu'elle n'imprime que le bon code couleur, puis l'entourer \[...\]
de l'invite.
\[
est\1
, et\[
est\2
. Celles-ci correspondent à quelqueRL_PROMPT_{START,END}_IGNORE
chose de readline qui lui demande d'ignorer les octets lors du comptage de la longueur de l'invite à l'écran. Voir lists.gnu.org/archive/html/bug-bash/2015-08/msg00027.html .