Bash는 PS1에서 특수 문자가 확장되지 않는다는 메시지를 표시합니다.

Bash는 PS1에서 특수 문자가 확장되지 않는다는 메시지를 표시합니다.

내 설정을 설정하려고 합니다.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으로 업데이트할 수 없습니다 .PS1prompt_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.

관련 정보