
내 설정을 설정하려고 합니다.PS1
런타임 조건에 따른 환경 변수이므로 다음을 사용합니다.PROMPT_COMMAND
이 방법. $?
값에 따라 bash 프롬프트를 변경 하고 싶다고 가정하면 .bashrc
프롬프트는 다음과 같습니다.
function prompt_command() {
if [ $? -eq 0 ]; then
BASH_PROMPT="\W --->"
else
BASH_PROMPT="[\t][\u][\w] -x->"
fi;
}
PROMPT_COMMAND=prompt_command
PS1='${BASH_PROMPT} '
나는 이점을 누리고 싶다.Bash 프롬프트 이스케이프 시퀀스. 안타깝게도 값이 있는 그대로 표시되므로 이 방법은 작동하지 않습니다.
BASH_PROMPT
또한 일부 도구에서 값을 수정하고 있기 때문에 중간 변수를 사용해야 합니다 PS1
. 예를 들어 가상 환경에 들어갈 때 가 (venv)
앞에 추가되므로 을 덮어쓰게 되므로 동적 PS1
으로 업데이트할 수 없습니다 .PS1
prompt_command
(venv)
이러한 특수 값이 올바르게 확장되지 않는 이유는 무엇이며, 서브쉘 생성을 의미하지 않는 해결 방법이 있습니까?
답변1
이러한 특수 값이 적절하게 확장되지 않는 이유는 무엇입니까?
man 1 bash
설명하다:
Bash를 사용하면 디코딩된 백슬래시 이스케이프 특수 문자 [...]를 삽입하여 이러한 프롬프트 문자열을 사용자 정의할 수 있습니다.
(귀하의 경우 \t
,,,,)\u
\w
\W
문자열이 디코딩된 후 매개변수 확장을 통해 확장됩니다. [...]
따라서 \t
등이 먼저 디코딩되고(그러나 귀하의 디코딩은 아닙니다 PS1
!) ${BASH_PROMPT}
나중에 확장됩니다. 이 확장 프로그램에서는 백슬래시로 이스케이프 처리된 특수 문자가 표시되지만 너무 늦게 디코딩됩니다.
서브쉘 생성을 의미하지 않는 해결 방법이 있습니까?
예. 찾았어요여기
Bash 4.4부터
@P
확장 기능을 사용할 수 있습니다
PS1='${BASH_PROMPT} '
전화하는 대신
PS1='${BASH_PROMPT@P} '
이제 $BASH_PROMPT
원래 디코딩과 일치하게 추가 디코딩이 수행됩니다 PS1
.