web-dev-qa-db-fra.com

Pourquoi mon invite Bash est-elle bugée quand je parcourt l'histoire?

Souvent, lorsque je commence à regarder l'historique des commandes, certains caractères d'une commande affichés ne sont pas effacés, par exemple:

Ce qui se passe:

Prompt$ some_command
Prompt$ some_commanother_command

Qu'est-ce qui aurait dû se passer:

Prompt$ some_command
Prompt$ another_command

Je ne peux pas effacer ces personnages et bash les ignore lors de l'exécution de la commande. Ils disparaissent également lorsqu'une nouvelle invite est affichée (après avoir appuyé sur Enter par exemple).

J'ai demandé aux autres personnes qui travaillent sur Linux sur mon lieu de travail et ils ont dit qu'ils ont parfois ce problème aussi aussi, mais ils n'avaient pas eu d'idée sur la manière de résoudre ce problème.

J'ai Ubuntu 11.10 et j'utilise Guake. Voici mon PS1:

\e[0;31m\u \A ${PWD##*/}\e[0;32m$(parse_git_branch)\e[0;31m$\e[m

parse_git_branch est

parse_git_branch () {
    git name-rev HEAD 2> /dev/null | sed 's#HEAD\ \(.*\)# (\1)#'
}

Autant que je sache, mes collègues ont ce problème même avec moins de "fantaisie" ps1.

67
korda

Utilisation \[...\] autour des parties de PS1 qui ont une longueur 0. Cela aide à bash pour obtenir la longueur de l'invite. Même avec cette mesure, votre ligne de commande peut être gâchée lorsque vous utilisez des caractères multibytes (au moins le mien fait). Frappe Ctrl+L Aide également dans de tels cas (mais efface l'écran en même temps).

70
choroba

Vous devez vous assurer que vous échappez à tous les caractères non imprimables.

Bon

PS1="\[\e[36m\]\W ⇨ \[\e[m\] "

Mauvais

PS1="\[\e[36m\]\W ⇨ [\e[m\] "
8
user43633