if 절에 대한 프롬프트 사용자 정의 문제

if 절에 대한 프롬프트 사용자 정의 문제

최근에 PS1을 약간 수정했습니다. 코드는 다음과 같습니다:

PS1='$(if [[ $? != 0 ]]; then echo " \e[91m\e[0m"; fi) \u $(assemble_prompt)$ '

누락된 문자의 출처는 다음과 같습니다.괴상한 글꼴내 질문에는 (기능뿐만 아니라 assemble_prompt) 중요하지 않습니다.

내가 직면한 문제는 터미널 창 크기를 프롬프트 크기(대략)로 축소할 때 PS1이 파손되는 것입니다. 그런 다음 PS1 설정을 무시하고 PS1을 문자로만 설정하는 것 같습니다 $(스크린샷 참조). 그런 다음 입력을 시작하면 이 경우 사용자 정의 프롬프트가 무시됩니다.

PS1은 바나나가되었습니다

이전 명령이 실패한 경우 "fail" 문자를 추가하는 if 절로 문제를 좁혔습니다. 해당 부분을 제거하면 모든 것이 예상대로 작동합니다.

if조항 부분을 유지하면서 창 크기가 너무 작을 때 PS1 재설정 문제를 해결할 수 있는 방법이 있습니까 ?

PS 저는 rxvt-unicode터미널로 사용하고 있지만 다른 모든 터미널에서도 문제가 지속됩니다(테스트됨 xterm, st).

답변1

\[...\]Bash에게 실제로 문자를 인쇄하지 않는다는 것을 알리기 위해 터미널 제어 코드를 포함하고 싶을 수도 있습니다 . 그렇지 않으면 프롬프트의 너비를 계산하려고 할 때 쉘을 혼동하게 됩니다.

따라서 "\[\e[91m\]xxx\[\e[0m\]".

로부터수동:

\[  Begin a sequence of non-printing characters. 
    This could be used to embed a terminal control sequence into the prompt.
\]  End a sequence of non-printing characters.

관련 정보