この bash プロンプトでは、履歴をスクロールするときに以前のコマンドの一部が保持されることがあるのはなぜですか?

この bash プロンプトでは、履歴をスクロールするときに以前のコマンドの一部が保持されることがあるのはなぜですか?

私の bash プロンプトは、いくつかの場所から盗んで寄せ集めたものだと認めますが、上下矢印で bash 履歴をスクロールすると、以前のコマンドの一部がその長さに追加されることがあります。

たとえば、以前のコマンドが次のとおりだったとします。

ls
cd /home/caleb
vim .bashrc

プロンプトで 2 回上にスクロールすると、次のようになります。

$ vim .bcd /home/caleb

最初の 5 文字は最後のコマンドから残ります。

なぜこのようなことが起きているのか、また、どうすれば止められるのか、誰か分かるでしょうか?

私のプロンプトは次のコードで設定されています (ここに含められないほど長いです):出典: github.com

答え1

プロンプトのどこかがおかしくなっています。通常、シェルは印刷できない用語コードを出力していると考え、それがスペースを占めることを期待しています。私があなたにできる最善のアドバイスは、この問題の原因となっているコードを特定するために、この動作が止まるまでプロンプトに体系的に追加 (または削除) することです。

答え2

カラーコードは角括弧で囲む必要があります。括弧はbashに、囲まれたテキストは印刷されないことを伝えます。

@Phreditor の例を基にすると、改行後に行われたフォーマットはすべて元の問題を引き起こすことがわかります。

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

フォーマット コードを [] で囲むことで、煩わしい動作が起こらないようにします。

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

ドキュメント:http://tldp.org/HOWTO/Bash-Prompt-HOWTO/nonprintingchars.html

PS1 フォーマットでは値が長くなりすぎて読みにくくなるため、フォーマット コードを変数に配置します。

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

答え3

私も同じ問題を抱えていましたが、それは色の定義に関連していました。

私の場合、複数行のプロンプトがあります (プロンプトによって表示されるパスの長さに関係なく、現在のコマンドに最大のスペースが与えられます)。

悪いバージョン:

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

良いバージョン:

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

\033[00m色を終了します。新しい行 ( ) の後にあると\n、以前のコマンドが背景色で上書きされ、端末で適切な再描画ができなくなります。新しい行の後ろに移動することで、問題は解決しました。

(Mac OS 10.8 のターミナルを使用)

答え4

私もこの問題に遭遇しました。何が検出されたのでしょうか?

PS1 変数内に色がある場合 (例: "\e[35m" )、常に "\[" と "\]" で囲む必要があります (例: "\[\e[35m\]" )。

このルールに従って PS1 のすべての色をマークすると、うまくいきました!

bash の履歴をスクロールする際に問題が発生することはなくなりました。

悪い例:PS1="\e[0;36m[\u@\h[\e[1;31m$ORACLESID\e[0;36m] \W]\e[0m"; PS1をエクスポート

良い例え:PS1="\[\e[0;36m\][\u@\h[\e[1;31m\]$ORACLESID\[\e[0;36m\]]\W]\e[0m\] "; PS1をエクスポート

関連情報