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

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

최근에 PS1을 조금 조정하고 있습니다. 코드는 아래와 같이 표시됩니다.

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

누락된 문자의 출처는 다음과 같습니다.대단하다 글꼴내 질문과 기능 assemble_prompt에는 중요하지 않습니다 .

내가 겪고 있는 문제는 터미널 창 크기를 프롬프트 크기(대략)로 줄이면 PS1이 손상된다는 것입니다. 그러면 PS1 설정을 무시하고 PS1을 $문자로만 설정하는 것 같습니다(스크린샷 참조). 입력을 시작하면 사용자 정의 프롬프트를 덮어쓰게 됩니다.

PS1 미친

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

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

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.

관련 정보