\[...\]
나는 기본적으로 문제가 무엇인지 알고 있습니다. (공백이 아닌?) 문자를 이스케이프 처리하고 bash가 프롬프트의 너비를 올바르게 계산할 수 있도록 하려면 이것을 사용해야 하기 때문입니다 .
그러나 나는 모든 것을 알아낼 수 없으며 정확히 어디에 모든 것을 넣어야 하는지 잘 이해하지 못하기 때문에 시행착오를 겪었습니다 \[...\]
.
STARTCOLOR='\[\e[0;31m\]'
ENDCOLOR='\[\e[0m\]'
BACKGROUND='\[\e[47m\]'
export PS1="$STARTCOLOR$BACKGROUND\u@\h \[\t\]$ENDCOLOR\w>\$?\$\]"
내가 사용하고있는 것입니다. 이제 유일한 문제는 화살표 키를 사용하여 이전 명령을 너무 오랫동안 스크롤하면 \w>\$?\$\
PS1 섹션이 사라진다는 것입니다. 이전 명령을 사용하여 앞으로 이동한 후 화살표 키를 사용하여 뒤로 돌아가는 경우에도 이런 현상이 발생합니다.
답변1
문제는 출력 내용을 인쇄하기 위해 비인쇄 태그를 사용하고 있다는 것입니다( \t
--timestamp).
STARTCOLOR='\[\e[0;31m\]'
ENDCOLOR='\[\e[0m\]'
BACKGROUND='\[\e[47m\]'
export PS1="$STARTCOLOR$BACKGROUND\u@\h \t$ENDCOLOR\w>\$?\$ "
\[ ... \]
색상 코드와 같이 인쇄되지 않는 문자의 주변 시퀀스에만 적용됩니다 .
답변2
따라서 문제는 \[
합계를 "과용"한다는 것입니다 \]
. 이는 인쇄할 수 없는 문자 시퀀스에만 사용할 수 있습니다.배쉬 매뉴얼:
\[
Begin a sequence of non-printing characters.
This could be used to embed a terminal control sequence into the prompt.
\]
또한 Bash가 탭을 올바르게 렌더링하려면 특수 구문을 사용해야 합니다 $'\t'
.
따라서 결국 프롬프트 코드의 다소 수정된 버전은 다음과 같습니다.
#!/usr/bin/env bash
readonly PROMPT_STARTCOLOR='\[\e[0;31m\]'
readonly PROMPT_ENDCOLOR='\[\e[0m\]'
readonly PROMPT_BACKGROUND='\[\e[47m\]'
export PS1="$PROMPT_STARTCOLOR$PROMPT_BACKGROUND\u@\h"$'\t'"$PROMPT_ENDCOLOR\w>$?$"
환경과의 충돌 가능성을 방지하기 위해 변수 이름을 변경했습니다.
이 스크립트를 사용하려면:
source <path_to_file>
제가 얼마전에 물어본 관련 질문은 다음과 같습니다.if 절에 대한 프롬프트 사용자 정의 문제