Bash 프롬프트: PROMPT_COMMAND에서 \[ 및 \] 사용

Bash 프롬프트: PROMPT_COMMAND에서 \[ 및 \] 사용

나는 bash 프롬프트에서 작업 중입니다. 또한 읽기 쉽고 유지 관리하기 쉽도록 프롬프트를 지능적으로 만들려고 노력합니다. 이는 큰 것이 없다는 것을 의미합니다 export PS1.

다양한 소스(포함이 문제) bash가 긴 명령으로 프롬프트를 덮어쓰지 않도록 알 수 있도록 주변 서식 지정 의 필요성 \[과 관련 내용을 참조하세요.\]

문자열을 생성할 때 마지막 명령( )의 종료 상태를 빨간색으로 표시하거나, 0이면 아무것도 표시하지 않으려는 PROMPT_LAST_EXIT_STATUS의도입니다 . 이것은 작동하지만 텍스트 s 및 s가 프롬프트에 표시되고 긴 명령 문제가 지속됩니다. 어딘가에 회피적인 문제일 수도 있지만 아직 발견하지 못했습니다.$?$?[]

예상치 못한 대괄호

다음 코드는 에 있습니다 ~/.bashrc.

prompt_last_exit_status () {
PROMPT_LAST_EXIT_STATUS="${?}";
if [[ ${PROMPT_LAST_EXIT_STATUS} == "0" ]];
then
    PROMPT_LAST_EXIT_STATUS=
else
    PROMPT_LAST_EXIT_STATUS=\[$(tput setaf 1)$(tput bold)\]${PROMPT_LAST_EXIT_STATUS}
    PROMPT_LAST_EXIT_STATUS+=\[$(tput sgr0)\]
    PROMPT_LAST_EXIT_STATUS+=" "
fi;
}


prompt_command () {
    prompt_last_exit_status
}
export PROMPT_COMMAND=prompt_command

PS1="\${PROMPT_LAST_EXIT_STATUS}"
PS1+="\[$(tput setaf 6)$(tput bold)\]\w"
PS1+="\[$(tput sgr0)\] \$ \[$(tput sgr0)\]"
export PS1

답변1

귀하의 할당 은 인용되지 않았으므로 문자열에 and를 PROMPT_LAST_EXIT_STATUS넣지 않고 단지 and 입니다 ( s는 이스케이프 문자로 간주되기 때문입니다).\[\][]\

비교하다:

$ foo=\[hello\]
$ echo "$foo"
[hello]

비교:

$ foo="\[hello\]"
$ echo "$foo"
\[hello\]

그뿐만 아니라 매개변수 확장(프롬프트 문자열에 변수 삽입)은 프롬프트 특수 문자 확장 후에 발생합니다. 따라서 변수에 \[and 를 넣는 것은 확장 되면 더 이상 특별하지 않기 때문에 작동하지 않습니다 . 유효한 대안은 색상 설정을 무조건적으로 만드는 것입니다. 예를 들면 다음과 같습니다.\]PROMPT_LAST_EXIT_STATUS$PROMPT_LAST_EXIT_STATUS\[\]

prompt_last_exit_status () {
    PROMPT_LAST_EXIT_STATUS="${?}"
    if [[ ${PROMPT_LAST_EXIT_STATUS} == "0" ]]
    then
        PROMPT_LAST_EXIT_STATUS=
    else
        PROMPT_LAST_EXIT_STATUS+=" "
    fi
}

prompt_command () {
    prompt_last_exit_status
}
export PROMPT_COMMAND=prompt_command

PS1="\[$(tput setaf 1)$(tput bold)\]\${PROMPT_LAST_EXIT_STATUS}\[$(tput sgr0)\]"
PS1+="\[$(tput setaf 6)$(tput bold)\]\w"
PS1+="\[$(tput sgr0)\] \$ \[$(tput sgr0)\]"
export PS1

답변2

PS1은 \[and를 \]1과 2로 평가합니다. \[PS1의 색상이 너무 길어서 및 색상을 넣지 않으려면 PS1에서 이미 1과 2가 포함된 변수를 사용하도록 할 수 있습니다. 을 사용하면 $'\001'변수에 1이 포함되고 를 사용하면 2가 포함됩니다 $'\002'. 작성된 대로 작동하도록 코드를 수정했습니다.

prompt_last_exit_status () {
    PROMPT_LAST_EXIT_STATUS=$?
    if [[ ${PROMPT_LAST_EXIT_STATUS} == "0" ]]; then
        PROMPT_LAST_EXIT_STATUS=
    else
        PROMPT_LAST_EXIT_STATUS=$'\001'$(tput setaf 1)$(tput bold)$'\002'$PROMPT_LAST_EXIT_STATUS
        PROMPT_LAST_EXIT_STATUS+=$'\001'$(tput sgr0)$'\002'
        PROMPT_LAST_EXIT_STATUS+=" "
    fi
}


prompt_command () {
    prompt_last_exit_status
}
export PROMPT_COMMAND=prompt_command

PS1='$PROMPT_LAST_EXIT_STATUS'
PS1+="\[$(tput setaf 6)$(tput bold)\]\w"
PS1+="\[$(tput sgr0)\] \$ \[$(tput sgr0)\]"
export PS1

추가 정보

PS1이 평가될 때 호출될 함수를 PS1이 참조하도록 할 수도 있습니다.

print_status() {
    printf "\001$(tput setaf 1)$(tput bold)\002$?\001$(tput sgr0)\002"
}
export -f print_status
export PS1='$(print_status) '

참고: 함수 내보내기를 print_status수행하면 suPS1이 의존하는 함수를 참조할 수 있습니다. 또한 내보낸 함수가 표준 Bourne 셸(sh)에서 작동하는지 확인하세요. git과 vim은 이러한 셸을 사용하고 이러한 기능을 사용하려고 시도하기 때문입니다.

관련 정보