너비가 0인 제어 문자를 사용하는 Bash 프롬프트

너비가 0인 제어 문자를 사용하는 Bash 프롬프트

프롬프트가 오른쪽에서 왼쪽으로 바뀌는 텍스트를 방지하기 위해 bash 프롬프트(U200e)에 너비가 0인 LRM을 삽입하고 싶습니다. 너비가 0인 문자이기 때문에 본능적으로 \[<200e>\]. 실제로 이로 인해 bash가 잘못된 위치에서 줄 바꿈되는 것으로 나타났습니다. 아무것도 포장하지 않았을 때,그 다음에잘 작동하는 것 같습니다.

나는 이해하지 못한다. Bash가 이 문자의 너비가 0임을 자동 감지하더라도 문자를 둘러싸면 \[...\]아무런 문제가 발생하지 않습니다.

편집됨: 따라서 문제는 \[...\]이스케이프가 실제로 필요한 시기와 이스케이프되는 문자의 너비가 실제로 0인 경우 어떻게 해로울 수 있는지입니다.

답변1

게시물 보기 Bash에서 길이가 0인 문자를 이스케이프 처리합니다.. 그리고 구체적으로 마이클 앨런의 답변 아래에서 재현합니다.

시퀀스 는 PS1을 포함한 일부 유틸리티에서 및 제어 코드를 \[나타내는 데 사용됩니다 .\001\002

\[=> \x01또는\001

\]=> \x02또는\002

\[printf와 echo는 에서 로의 변환을 수행하지 않습니다 \001.

그래서 해결책은 직접 변환을 수행하는 것이 었습니다. 길이가 0인 문자를 다음과 같이 래핑하는 대신 \[:

echo "\[\033[1;30m\]foo\[\033[0m\]"

출력은\[foo\]

대신 실제 제어 코드를 출력합니다.

echo "\x01\033[1;30m\x02foo\x01\033[0m\x02"

fooPS1 printf와 echo 모두에서 출력됩니다 .

구체적인 예를 보려면 다음을 참조하세요.git-radar에 대한 커밋입니다.

관련 정보