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


29

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

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

ls
cd /home/caleb
vim .bashrc

プロンプトが表示されて2回スクロールすると、次のようになります。

$ vim .bcd / home / caleb

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

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

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


1
PS1をすべてのvcsが不要な値に設定し、何が起こるかを確認します。それは私の推測です。
ダニエルベック

プロンプトですでに犯人を見つけましたか?私は同じ問題を抱えています。
acme 14

ええbashは色でそれを失い、目に見える文字列の長さから色エスケープで文字列の長さを分離することはできません。これがSiegeXの狙いです。ZSHに切り替えて、別のプロンプトを使用することになりました。ZSHには同じ問題はありません。
カレブトンプソン14

1
両方の前の答えは私の問題を解決しませんでした、そして、これが起こった理由を説明しませんでした。誰かがこのポイントまで検索した場合、Custom Bashプロンプトがそれ自体を上書きしていることを確認してください。
D3Hunter 14

回答:


6

どこかあなたのプロンプトはfubarです。通常起こることは、シェルが出力不可能な用語コードを出力し、それがスペースを占有することを期待していることです。この問題が発生しているコードを特定するために、この動作が停止するまで、プロンプトに体系的に追加(または削除)することをお勧めします。


37

カラーコードは角かっこで囲む必要があります。括弧は、囲まれたテキストを印刷しないことを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
これは受け入れられた答えでなければなりません。問題を解決しました。
Atcold

1
注意しなければならない(私はそれを注意し損ねた;))、その円記号と角括弧の混乱では、エスケープシーケンスに続く角括弧をエスケープし\033ないでください。折り返し角括弧のみをエスケープします。
ベンジャム

最初のグーグルの結果を使用して、これらすべての特殊文字を処理するために私を混乱させる方法は、私が望んだとおりに作業プロンプトを正確に生成するのに役立ちました:ezprompt.net
Mallox

私はYEARSのプロンプトの色をカスタマイズしたいと思っていましたが、常にこの問題が発生していたので、それはありませんでした!理由がわからなかったので、停止してすべてを白のままにした...新しいコンピューターをセットアップしたところ、問題を実際にGoogleで確認することになりました... この素晴らしいレッスンをありがとう。
TylerH4

8

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

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

悪いバージョン:

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


これは私にとって問題を特定しましたが、現在受け入れられている答えはあまりにも一般的でした。
ブライアン14

これはより正確な答えであり、勝者になるはずです(また、私の問題の解決策でもありました)。
craveytrain

\nあまりにも私のために犯人でした。ありがとう!
-mhulse

3

実際には、これは「印刷されない文字」区切り文字の欠落に関係していると思います。私はまったく同じ問題を抱えていましたが、改行(\ 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など、他の人にも当てはまる可能性があります-テストはお客様の側で必要です。)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.