2016-10-21 1 views
0

Je veux définir mon invite PS1 à la sortie d'une fonction, mais quand j'essaie d'inclure des séquences de couleurs ansi, bash va penser que la longueur de la ligne est plus longue que est réellement et gâcher quand vous tapez assez après pour aller à une nouvelle ligne. Voici ce que le code ressemble à:Comment colorier bash invite PS1 à partir du résultat d'une fonction

ps1() { 
    echo -ne "\033[01;34m$(dirs -0)\033[0m \$ " 
} 
PS1='$(ps1)' 

Répondre

0

Mettre \[ et \] autour des séquences d'échappement. Cela indique au shell de ne pas les compter lorsqu'il détermine la largeur de l'invite.

ps1() { 
    echo -ne "\\[\033[01;34m\\]$(dirs -0)\\[\033[0m\\] \$ " 
} 

Voir Bash Prompt Escape Sequences pour toutes les séquences spéciales que vous pouvez utiliser dans l'invite (par exemple, vous pouvez utiliser \e au lieu de \033 pour évasion et \w pour le répertoire en cours au lieu de $(dirs -0)).

Vous devez doubler les barres obliques inverses dans ces séquences pour les empêcher d'être consommées par echo -e. Mais si vous utilisez simplement les séquences d'échappement listées ci-dessus, vous n'avez pas vraiment besoin de -e, puisque bash traitera les séquences d'échappement dans PS1 lui-même.

+0

cela ne fonctionne pas pour moi. seulement dans PS1 = '\\ [... \\]' cela fonctionne-t-il? – Jake

+0

Je vois, c'est parce que 'echo -e' essaie d'interpréter les séquences d'échappement. – Barmar

+0

J'ai mis à jour ma réponse. – Barmar