BASH - PS1을 사용자 정의하여 명령 실행

BASH - PS1을 사용자 정의하여 명령 실행

매번 일부 명령을 실행하도록 PS1을 수정하고 싶습니다. 내가 원한다고 가정해 보겠습니다. 마지막으로 실행된 명령이 성공하면 PS1 끝에 녹색 스마일이 추가되고, 그렇지 않으면 스마일이 빨간색이 되어야 합니다.
나는 그것을 함수로 추출했습니다.

function exit_smile {

    EXITSTATUS="$?"
    RED="\[\e[1;31m\]"
    GREEN="\[\e[32;1m\]"

    if [ "${EXITSTATUS}" -eq 0 ]
    then
       SMILE="${GREEN}:)"
    else
       SMILE="${RED}:("
    fi

    echo -n "$SMILE"
}

그런 다음 PS1 변수를 수정할 때 및 를 사용하려고 시도 하지만 `exit_smile`PS1을 수정하거나 색상 대신 텍스트를 인쇄할 때 \$(exit_smile)한 번만 수행합니다 . 예를 들어\[\e...\]

PROMPT="\u@\h \W"
PS1="${PROMPT} \$ \$(exit_smile) ${OFF}\n"

주어진 username@hostname ~ $ \[\e[32;1m\]:)
내가 무엇을 놓치고 있습니까?

답변1

이것이 버전 간에 변경되었는지는 확실하지 않지만 (*) 내 Bash 매뉴얼 페이지는 다음과 같습니다.

Bash를 사용하면 다음과 같이 디코딩되는 백슬래시로 이스케이프된 특수 문자를 삽입하여 이러한 프롬프트 문자열을 사용자 정의할 수 있습니다.

(목록에는 등이 포함되어 \e있습니다 \[. \])

뒤쪽에문자열은 디코딩되고 매개변수 확장, 명령 대체 등을 통해 확장됩니다.

\[..\]즉 , 명령 대체에서 나올 수 없고 명령 대체보다 앞에 있어야 함을 의미합니다 .

\u(이것은 또한 명령 대체에 대한 인수로 또는 를 사용할 수 있으며 명령이 실행되기 전에 대체된다는 것을 의미합니다 . 그리고 명령 대체를 넣는 것이 무엇을 할지 \w모르겠습니다 ... 다른 경우에 더 유용할 것입니다. \[..\]방법은 대략 의미가 있습니다.

따라서 색상 코드를 별도의 확장자에 넣어 수동으로 보호해야 합니다 \[..\]. 명령 대체 대신 변수를 사용하고 $'...'확장을 사용하여 ESC 문자를 가져옵니다.

prompt_smile() {
        if [ "$?" = 0 ] ; then
                smile=' :) '
                smilecolor=$'\e[1;32m'
        else
                smile=' :( '
                smilecolor=$'\e[1;31m'
        fi
        normalcolor=$'\e[0m'
}

PROMPT_COMMAND=prompt_smile
PS1='\u@\h \W \$ \[$smilecolor\]$smile\[$normalcolor\]\n'

(*이것을 알고 싶은 이유는 나이가 많고유사하지만 중복되지 않는 질문\[..\]확장 프로그램에서 출력되는 것 같습니다)

관련 정보