web-dev-qa-db-fra.com

Problème d'emballage de ligne d'invite de shell

J'ai fait quelque chose pour casser mon invite Bash Shell dans un terminal OS X (10.5.7).

Voici la PS1 que j'avais configurée:

PS1='\[\e[1;32m\]\h\[\e[0m\]:\[\e[1;34m\]\w\[\e[0m\]\$ '

Autant que je sache, les commandes de couleur s'échappent correctement. Toutefois, lorsque je fais défiler de haut en bas l’historique des commandes, il ya souvent des problèmes de retour à la ligne lorsque les commandes historiques se superposent à plusieurs lignes. 

J'ai simplifié mes invites comme suit:

PS1='\[\e[1m\]\h:\w\$ \[\e[0m\]'
PS2='> '

Et je vois encore quelque chose comme:

localhost: ~/Bibliothèque/Support d'application/Firefox/Profils/knpmxpup.Defau 
 lt/extensions/{1A2D0EC4-75F5-4c91-89C4-3656F6E44B68} $  expocd\{1A2D0EC4-7 
 5F5-4c91-89C4-3656F6E export PS1 = "\ [
\e [1; 32m \]\h\[\ e [0m \]: cd Bibliothèque /Support d'application/

J'ai aussi essayé \033 au lieu de \e. Je viens d’inclure la PS2 pour information, je n’ai pas modifié le réglage par défaut. Si je supprime complètement les codes de couleur, tout fonctionne bien, des idées?

37
Rob

Les problèmes de retour à la ligne dans Bash ne sont pas nouveaux. Consultez la liste de diffusion, il y a peut-être un autre bogue à ce sujet.

Vous ne pouvez pas faire beaucoup plus que marquer des caractères non imprimables, le reste doit être effectué à l'aide du code d'invite.

4
TheBonsai

J'utilise maintenant cette PS1 avec un bon effet:

green=$(tput setaf 2)
blue=$(tput setaf 4)
bold=$(tput bold)
reset=$(tput sgr0)
PS1="\[$green$bold\]\h\[$reset\]:\[$blue$bold\]\w\[$reset\]\$ "

Faire défiler l'historique de mes commandes semble traiter maintenant les retours à la ligne. Cependant, depuis que cette question a été posée, j'ai également mis à jour mon OS X à la version 10.6.3.

47
Rob

Ce thread de stackoverflow semble pertinent. Comme quelqu'un l'a noté dans ce fil de discussion, le Bash FAQ sur mywiki.wooledge.org explique comment citer correctement les codes de couleur dans les invites Bash ( FAQ 53 ) , et l’appel correct des couleurs du terminal ( FAQ 37 ).

20
willdye

Il semble que vous ayez correctement échappé et enfermé des séquences.

Une solution de contournement que j’utilise de toute façon pour ajouter un '\ n' à la fin. Je trouve cela plus clair et j'atténue tout problème lié aux problèmes d'emballage. La fin exacte de ma PS1 est:

'\n\[\033[0;30m\]$\[\033[0m\]

Un excellent guide que vous connaissez probablement:

Invite Bash

1
neuro

Voici le mien: c'est le meilleur que j'ai trouvé, mais le site où j'avais initialement découvert qu'il manquait un caractère d'échappement nous a conduit au problème de retour à la ligne. Je l'ai bricolé et l'ai finalement fait fonctionner. Il montre votre utilisateur, le chemin et les informations de branche avec un bon contraste, en couleurs.

export PS1='\[\e[1;37m\]\[\e[1;32m\]\u\[\e[0;39m\]:\[\e[1;33m\]\w\[\e[0;39m\]\[\e[1;35m\]$(__git_ps1 " (%s)")\[\e[0;39m\] \[\e[1;37m\]|\[\e[0;39m\]\$'

Aussi, ajoutez 

GIT_PS1_SHOWDIRTYSTATE=true

Pour afficher un marqueur lorsqu'une branche est "sale" (les modifications à valider existent)

export HISTCONTROL=ignoredups

Il est également utile d’ignorer les doublons lors du défilement de l’historique bash.

bind "set completion-ignore-case on" 

Aide aussi.

Enfin, 

shopt -s checkwinsize

Peut être utile sous OSX si les problèmes persistent.

1
rcd

J'ai remarqué qu'il y avait des problèmes avec le positionnement du curseur d'invite même s'il n'y avait pas de caractère spécial dans la variable d'environnement PS1 ou Prompt

Si nous produisons un fichier qui n'a pas de caractère de fin de ligne à la fin. Il va confondre l'invite. 

Vous pouvez reproduire ceci en faisant:

curl https://Gist.githubusercontent.com/martinos/d4aa0a7d4d752b0d0d9f/raw/3198c39f84a080c44227a084a19fb3a0bb661ee5/wrapping_issue.txt

et en appuyant plusieurs fois sur la touche haut, vous constaterez que l’invite est confuse. 

Vous pouvez voir un exemple de cela en action:

https://asciinema.org/a/9mtjhi9dib6md4ocsbw210cca

Lorsque cela se produit, appuyez simplement sur <CTRL-C> et l'invite reviendra à la normale.

Notez que ZShell n'a pas ce problème.

1
Martinos

'shopt -s checkwinsize' fonctionne également pour les problèmes d'emballage Cygwin

0
user3375990

Si vous utilisez l'astuce de la barre de titre "\e]2;titlebar\a", veillez à y échapper aussi: "\[\e]2;titlebar\a\]"

0
Charlie

Pour référence future, voici ce que j'utilise:

export PS1="\[\033[0;31m\][\u@Project:\w]$\[\033[0m\] "

Cela afficherait mon invite de shell comme suit:

[ec2-user@Project:~]$

M'aide à distinguer les sites en direct des sites de développement.

0
Anil