web-dev-qa-db-ja.com

PS1の問題、CLIの混乱

簡単なPS1割り当てを行いました

PS1="\e[0;31m[\W]\$ \e[m "

私がしたかったのは、プロンプトの色を変更し、相対パスのみを表示することでした。ただし、これはCLIを台無しにします。たとえば、を使用して履歴を参照すると、表示がトリミングされて重なります。長いコマンドを入力すると、カーソルが画面の先頭に移動し、プロンプト表示自体と重なります。私は何を間違えましたか?

16
yayu

それは、bashがプロンプトがそれよりも長いと考えるからです。たとえば、エスケープシーケンス\e[0;31mは端末に吸い込まれ、次のテキストが赤に変わりますが、bashはそれを知りません。そのため、bashにその文字列をプロンプトの長さでカウントしないように指示する必要があり、\[ \]で囲むことでそれを行います。また、ターミナルエスケープシーケンスをハードコーディングする代わりにtputを使用することをお勧めします。

red=$(tput setaf 1)
reset=$(tput sgr0)
PS1='\[$red\][\W]\$\[$reset\] '

詳細については、 BashFAQ 5 および 端末コード(ANSI/VT100)の概要 を参照してください。

30
geirha