web-dev-qa-db-ja.com

履歴を参照すると、bashプロンプトにバグが発生するのはなぜですか?

コマンドの履歴を見始めると、表示されるコマンドの一部の文字が消去されないことがよくあります。たとえば、次のようになります。

何が起こっていますか:

Prompt$ some_command
Prompt$ some_commanother_command

何が起こったか

Prompt$ some_command
Prompt$ another_command

これらの文字は消去できず、bashはコマンドの実行時にそれらを無視します。また、新しいプロンプトが表示されている場合(Enterを押した後など)にも表示されません。

私の職場でLinuxを使用している他の人に尋ねたところ、彼らも時々その問題を抱えていると言いましたが、彼らはその問題をどのように解決するのか考えていませんでした。

Ubuntu 11.10を使用していますが、guakeを使用しています。これが私のPS1

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

どこ parse_git_branch

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

私の知る限りでは、同僚は「派手な」PS1が少なくても問題を抱えています。

67
korda

使用する \[...\] PS1の長さが0の部分を囲みます。プロンプトの長さを正しく取得するためにbashを支援します。この方法を使用しても、マルチバイト文字を使用するとコマンドラインが損なわれる可能性があります(少なくとも私の場合はそうです)。ヒッティング Ctrl+L このような場合にも役立ちます(ただし、同時に画面がクリアされます)。

70
choroba

印刷できない文字をすべてエスケープすることを確認する必要があります。

良い

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

悪い

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