web-dev-qa-db-ja.com

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

私のbashプロンプトは、いくつかの場所から盗まれて一緒に石畳になったことを認めますが、上/下矢印でbash履歴をスクロールすると、前のコマンドの一部がその長さに追加されることがあります。

たとえば、以前のコマンドが次の場合:

ls
cd /home/caleb
vim .bashrc

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

$ vim .bcd/home/caleb

最後のコマンドから最初の5文字が残っている場所。

なぜこれが起こっているのか、そしてどのようにそれを止めることができるのか誰かが何か知っていますか?

私のプロンプトは次のコードで設定されています(ここに含めるには長い方法): https://Gist.github.com/1679352

31
Caleb Hearth

あなたのプロンプトはどこかfubarです。通常、シェルが出力不可能なタームコードを出力し、スペースを占有することを期待していると考えられます。私があなたに与えることができる最善のアドバイスは、この問題を引き起こしているコードを分離するためにこの動作が停止するまで、体系的にプロンプ​​トに追加する(またはプロンプトを取り除く)ことです。

6
SiegeX

カラーコードは角括弧で囲む必要があります。括弧は、囲まれたテキストを印刷してはならないことを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}\$ "
41
m79lkm

同じ問題があり、色の定義に関連していました。

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

悪いバージョン:

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のターミナルを使用)

8
Phreditor

実際には、これは欠落している「非印刷文字」区切り文字に関係していると思います。まったく同じ問題がありましたが、改行(\ n)の前に移動しても修正されませんでした。代わりに、すべての非印刷文字(ここでは、色付けコマンド)を '\ ['および '\]'で正しく囲みました。

悪い(動作しますが、上記の履歴を壊す問題があります):

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

良い(すべてのカラーコマンドが '\ ['と '\]'で囲まれている-マッシュされたコマンド履歴を表示しない):

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

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

これをSecureCRTのようなものに入れて、システムへのログイン時に自動送信する場合、自動ログインシステムが最初のバックスラッシュ自体を消費して送信する文字を決定する場合は、すべてを二重にエスケープする必要があります(どこにでも二重のバックスラッシュを置きます)。 :

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

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

(これは間違いなくSecureCRTに当てはまり、PuTTYやTeraTermなど、他の人にも当てはまる可能性があります。テストはユーザー側で必要です。)

3
skeetastax