Pourquoi cette invite bash conserve-t-elle parfois une partie des commandes précédentes lors du défilement de l'historique?


29

Mon invite bash, que j'avoue avoir volé à quelques endroits et bricolé, ajoutera parfois une partie des commandes précédentes à sa longueur lors du défilement de l'historique bash avec des flèches haut / bas.

Par exemple, si mes commandes précédentes étaient:

ls
cd /home/caleb
vim .bashrc

Lorsque j'étais à mon invite et que j'ai fait défiler deux fois vers le haut, cela pourrait ressembler à:

$ vim .bcd / home / caleb

Où les cinq premiers caractères sont restés de la dernière commande.

Quelqu'un a-t-il une idée pourquoi cela se produit et comment cela peut être arrêté?

Mon invite est définie avec ce code (trop long pour l'inclure ici): https://gist.github.com/1679352


1
Définissez PS1 sur une valeur sans la merde vcs entière et voyez ce qui se passe. Voilà ma supposition.
Daniel Beck

Avez-vous déjà trouvé le coupable dans votre invite? J'ai le même problème.
Acme

Ouais bash le perd sur les couleurs et ne peut pas séparer la longueur des chaînes avec des échappements de couleur de la longueur de la chaîne visible. C'est ce à quoi SiegeX voulait en venir. J'ai fini par passer à ZSH et à utiliser une invite différente. ZSH n'a pas le même problème.
Caleb Thompson

1
Les deux réponses précédentes n'ont pas permis de résoudre mon problème et n'ont pas expliqué pourquoi cela s'est produit. Veuillez vérifier que l' invite Bash personnalisé est en train de se remplacer , si quelqu'un a déjà recherché.
D3Hunter

Réponses:


6

Quelque part, votre invite est fubar. Ce qui se passe généralement, c'est que votre shell pense qu'il sort des codes de termes non imprimables et s'attend à ce qu'il prenne de la place. Le meilleur conseil que je puisse vous donner est d'ajouter systématiquement (ou de supprimer) votre invite jusqu'à ce que ce comportement s'arrête pour isoler le code à l'origine de ce problème.


37

Les codes de couleur doivent être placés entre crochets. Les crochets informent bash que le texte joint ne doit pas être imprimé

en s'appuyant sur l'exemple de @ Phreditor, cela montre que toute mise en forme effectuée après la nouvelle ligne entraînera le problème d'origine:

export PS1="\n\n\[\033[01;33m[\w]\033[00m\n\033[0;90m\$ "

encapsuler le code de format dans [] garantit que les comportements ennuyeux ne se produisent jamais:

export PS1="\n\[\[\033[01;33m\][\w]\[\033[00m\]\n\[\033[0;90m\]\$ "

La documentation: http://tldp.org/HOWTO/Bash-Prompt-HOWTO/nonprintingchars.html

Étant donné que le formatage PS1 rend la valeur si longue et difficile à lire, je mets les codes de format dans des variables:

BYELLOW='\[\033[01;33m\]'
IBLACK='\[\033[0;90m\]'
PS_CLEAR='\[\033[0m\]'
export PS1="\n${BYELLOW}[\w]${PS_CLEAR}\n${IBLACK}\$ "

3
Ce devrait être la réponse acceptée. A résolu le problème.
Atcold

1
Il convient de noter (parce que je ne l'ai pas noté;)), que dans ce gâchis de barres obliques inverses et de crochets, les crochets qui suivent la séquence d'échappement ne \033doivent PAS être échappés. Seuls les crochets d'emballage doivent être échappés.
Benjam

Façon de confondre pour moi de gérer tous ces caractères spéciaux, l'utilisation du premier résultat Google a aidé à générer une invite de travail exactement comme je le voulais: ezprompt.net
Mallox

Je voulais personnaliser mes couleurs d'invite depuis des années, mais je ne l'ai jamais fait depuis que j'ai toujours eu ce problème! Je n'ai jamais pu comprendre pourquoi alors je me suis juste arrêté et j'ai tout gardé blanc ... J'étais en train de configurer un nouvel ordinateur et j'ai finalement compris que je recherchais le problème pour une fois sur Google ... Si heureux! Merci pour cette merveilleuse leçon.
TylerH4

8

J'ai eu le même problème et c'était lié aux définitions des couleurs.

Dans mon cas, j'ai une invite sur plusieurs lignes (donne plus d'espace pour la commande actuelle quelle que soit la longueur de chemin affichée par l'invite).

Mauvaise version:

export PS1="\n\n\[\033[01;33m[\w]\n\033[00m\$ "

Bonne version:

export PS1="\n\n\[\033[01;33m[\w]\033[00m\n\$ "

\033[00mtermine la couleur. Si c'est après la nouvelle ligne ( \n), cela empêche un nouveau tracé correct dans le terminal, pour remplacer les commandes précédentes par la couleur d'arrière-plan. Le déplacer derrière la nouvelle ligne a résolu le problème.

(en utilisant Terminal sous Mac OS 10.8)


Cela a identifié le problème pour moi, alors que la réponse acceptée actuelle était trop générique.
Brian

C'est la réponse la plus précise et devrait être la gagnante (et c'était aussi la solution à mon problème).
craveytrain

l' \nétaient le coupable pour moi aussi. Merci!
mhulse

3

En fait, je pense que cela a à voir avec un délimiteur de «caractère non imprimable» manquant. J'ai eu exactement le même problème, mais le déplacer avant la nouvelle ligne (\ n) ne l'a pas résolu. Au lieu de cela, j'ai correctement entouré tous les caractères non imprimables (ici, les commandes de coloration) avec '\ [' et '\]'.

Mauvais (fonctionne, mais présente le problème de purge d'historique décrit ci-dessus):

PS1="\e[32m\u\e[35m@\e[32m\h \e[33m\w\e[36m\n\$\e[0m"

Bon (entouré de toutes les commandes de couleur par '\ [' et '\]' - n'affiche pas l'historique des commandes écrasées):

PS1="\[\e[32m\]\u\[\e[35m\]@\[\e[32m\]\h \[\e[33m\]\w\[\e[36m\]\n\$\[\e[0m\]"

i.e. "\e[...m" --becomes--> "\[\e[...m\]"

Et si vous mettez ceci dans quelque chose comme SecureCRT pour envoyer automatiquement lors de la connexion à un système, vous devrez peut-être tout double échapper (mettre des doubles barres obliques inverses partout) si le système de connexion automatique consomme la première barre oblique inverse elle-même pour déterminer le caractère à envoyer :

PS1="\\[\\e[32m\\]\\u\\[\\e[35m\\]@\\[\\e[32m\\]\\h \\[\\e[33m\\]\\w\\[\\e[36m\\]\\n\\$\\[\\e[0m\\]"

i.e. "\..." --becomes--> "\\..."

(Ceci est certainement vrai pour SecureCRT et peut être vrai pour d'autres, tels que PuTTY ou TeraTerm - tests requis de votre part.)

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.