Les longues lignes se chevauchent dans l'invite personnalisée Bash PS1

13

J'ai configuré une PS1invite bash de fantaisie à deux lignes , avec le nom du serveur, l'heure, le nom d'utilisateur et d'autres variables utiles.

PS1="\n\[\033[1;34m\]\342\226\210\342\226\210 \u @ $SERVER_NAME""$BBlue"" \w""$Color_Off  \n\[\033[0;36m\]\342\226\210\342\226\210 \d \t $ \[\033[0;39m\]"

entrez la description de l'image ici

Source complète de Github ici .

Le problème est que les longues lignes sont souvent enroulées autour d'elles, ce qui signifie que la nouvelle ligne chevauche la précédente.

Le problème est incohérent: certaines lignes sont encapsulées correctement, d'autres non.

Une idée de comment résoudre ce problème?

Adam Matan
la source

Réponses:

16

Voici ma fantaisie PS1 à deux lignes pour l'invite bash.

PS1

\[\e[1;32m\]\H\[\e[0m\] :: \[\e[1;30m\]\d\[\e[0m\] \@ :: \[\e[1;33m\]\w\n\[\e[1;34m\]\u $ \[\033[0m\]

Voici donc ce que j'ai fait. Si c'était ma couleur:

\e[1;32m

Je l'ai changé en:

\[\e[1;32m\]

Vous devez essentiellement le joindre à:

\[$mycolor\]

Consultez cette réponse .

varunyellina
la source
+1 Merci. Curieusement, cela ne semble pas fonctionner sur mac.
Adam Matan
Vous êtes un épargnant de vie! Quant à mac, Adam .. C'est très probablement en raison du nombre de colonnes. Essayez de définir l'invite à une chaîne de caractères, comme «ceci est mon invite:» et voyez si le problème persiste. Si tel est le cas, votre paramètre de colonne sur votre terminal est soit trop large, soit trop étroit.
Alex Summers
7

Trouvé cette solution en ligne, qui a suggéré une fermeture des parenthèses aux variables de couleur:

Change ça:

Black='\e[0;30m'        # Black
Red='\e[0;31m'          # Red
Green='\e[0;32m'        # Green

à:

Black='\e[0;30m\]'        # Black
Red='\e[0;31m\]'          # Red
Green='\e[0;32m\]'        # Green

J'ai engagé le changement - j'espère que cela fonctionne comme prévu.

Adam Matan
la source
1
ne sais pas ce que cela est censé atteindre. Vous devez envelopper tout ce qui ne prend pas de place (ansi-échappements) \[ \], donc vous ne pouvez pas simplement terminer toutes les couleurs ansi-escape avec \]car si ce n'est pas le cas \[. Lorsque vous mettez des caractères non imprimables, vous devez simplement les envelopper \[ \](par exemple PS1='\[\e[32;1m\] green prompt \[\e[0m\] $').
dylnmc
En effet! Sans l'ouverture \ [, cela renvoie l'invite pour nous, les utilisateurs de Linux. C'est peut-être différent pour OSX? Comme c'est étrange. \ [et \ e [sont interprétés comme deux choses différentes pour linux. Le premier indique de bash que la séquence suivante n'est pas imprimable et de ne pas la compter comme faisant partie des caractères affichés de l'invite. Le \ e [est le crochet d'échappement pour démarrer un jeu de couleurs ANSI.
Alex Summers
0

Ma solution préférée au problème du chevauchement des longues lignes dans bash PS1 est d'avoir un \nà la fin des lignes d'invite PS1.

par exemple

entrez la description de l'image ici

Si vous voulez tous mes autres trucs - temps, utilisateur, hôte, répertoire et branche git (!), Vous pouvez utiliser ceci (mac ou linux):

/unix//a/124012/10043

Michael Durrant
la source
pour la branche git, vous devez utiliser if [[ $(git rev-parse --is-inside-git-dir 2> /dev/null) ]]; then branch="$( git symbolic-ref --short -q HEAD 2> /dev/null )"; fi. C'est une norme lorsque vous mettez git dans un script et que vous évaluez le nom de la branche d'après ce que j'ai lu précédemment.
dylnmc