터미널 프롬프트에 인쇄되지 않는 문자가 표시됨

터미널 프롬프트에 인쇄되지 않는 문자가 표시됨

색상이 없으면 내 프롬프트는 다음과 같습니다.

[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\$

원본 프롬프트

멋져요! 하지만배쉬FAQ다음과 같이 지적합니다.

\[ \]는 PS1을 할당할 때만 특별합니다. 프롬프트가 표시될 때 실행되는 함수 내에서 인쇄하면 작동하지 않습니다. 이 경우 \001 및 \002 바이트를 사용해야 합니다.

\001그러나 사용하도록 프롬프트를 변경하면 \002다음과 같은 메시지가 표시됩니다(StackExchange는 너비가 0인 문자로 올바르게 렌더링하는 것처럼 보이지만 거기에 있습니다).

[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에서 올바르게 보입니다.

색상 시퀀스를 이스케이프 처리하기 위해 다음 두 명령을 사용하고 있습니다.

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

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

Ubuntu에서 \001...를 사용하려면 두 번째 옵션 대신 무엇을 해야 합니까 ?\002

관련 정보