端末プロンプトに表示されない文字が表示される

端末プロンプトに表示されない文字が表示される

色がない場合、プロンプトは次のようになります。

[0] [dimo414@dimo414:/tmp]
$ echo $PS1 | sed 's/\x1b/\\e/g'
\n[0] [dimo414@dimo414:/tmp]\n\$

色を追加して\[...\]区切ります:

[0] [dimo414@dimo414:/tmp]
$ echo $PS1 | sed 's/\x1b/\\e/g'
\n[\[\e[32m\]0\[\e[0m\]] [\[\e[34m\]dimo414\[\e[0m\]\[\e[32m\]@dimo414\[\e[0m\]:\[\e[94m\]/tmp\[\e[0m\]]\n\$

オリジナルプロンプト

素晴らしいですね!しかしBashFAQ次のように指摘している。

\[ \] は PS1 を割り当てるときにのみ特別な意味を持ちます。プロンプトが表示された時に実行される関数内でそれらを印刷すると機能しません。この場合、バイト \001 と \002 を使用する必要があります。

ただし、プロンプトを\001とを使用するように変更すると\002、次のようになります (StackExchange はこれらをゼロ幅文字として正しくレンダリングしているように見えますが、実際に存在します)。

[0] [dimo414@dimo414:/tmp]
$ echo $PS1 | sed 's/\x1b/\\e/g'
\n[\e[32m0\e[0m] [\e[34mdimo414\e[0m\e[32m@dimo414\e[0m:\e[94m/tmp\e[0m]\n\$

新しい壊れたプロンプト

この同じプロンプト(\001...付き\002)は、OSX 上の iTerm2 でも正しく表示されます。

カラーシーケンスをエスケープするために、次の 2 つのコマンドを使用しています。

# Previously (works)
printf '\[%s\]' "$(color "$@")"

# Currently (doesn't work on Ubuntu)
printf '\001%s\002' "$(color "$@")"

Ubuntu で\001...を使用するには、2 番目のオプションの代わりに何をすればよいですか?\002

関連情報