PS1에서 대괄호를 다시 이스케이프 처리함

PS1에서 대괄호를 다시 이스케이프 처리함

~처럼다른 사람PS1색상 코드 는 에 포함되어야 하며 \[수평 \]공간을 차지하지 않도록 명시되어 있습니다 . 필요한 코드를 추가했습니다.bashrc:

highlight()
{
    if [ -x /usr/bin/tput ]
    then
        printf '\['
        tput bold
        printf '\]'
        printf '\['
        tput setaf $1
        printf '\]'
    fi
    shift
    printf -- "$@"
    if [ -x /usr/bin/tput ]
    then
        printf '\['
        tput sgr0
        printf '\]'
    fi
}

highlight_error()
{
    highlight 1 "$@"
}

마지막 함수는 PS1이전 명령의 결과에 따라 문자열을 변경할 수 있도록 일반 및 이스케이프 명령 대체에 사용됩니다.

# Exit code
PS1="\$(exit_code=\${?#0}
highlight_error \"\${exit_code}\${exit_code:+ }\")"

...

if [ "$USER" == 'root' ]
then
    PS1="${PS1}$(highlight_error '\u')"
else
    PS1="${PS1}\u"
fi

문제는 이스케이프된 대괄호가 리터럴로 출력된다는 것입니다. 따라서 존재하지 않는 명령을 실행한 후 프롬프트는 다음과 같습니다.

\[\]\[\]127 \[\]user@machine:/path
$

도망가는 사람을 감싸는 것은 도움이 highlight_error되지 printf %b않습니다. 내가 할 수 있도록 출력을 어떻게 수정합니까?일반 및 이스케이프 명령으로 대체된 기능?

답변1

실제로 모든 이스케이프 시퀀스를 and PS1에 래핑해야 하는 것처럼 보이지만 출력을 생성하는 함수나 명령을 호출하는 경우 이를 래핑할 필요가 없습니다.\[\]

그럼 그냥 움직이면 되지?

"\$(exit_code=\${?#0}
highlight_error \"\${exit_code}\${exit_code:+ }\")"

함수 내부의 내용, 예:

print_error_if_error()
{
    exit_code=$?
    if [ $exit_code -ne 0 ]; then
        highlight_error "$exit_code "
    fi
}

\[그럼 다 지워도 될 것 같은데 \]...

highlight()
{
    if [ -x /usr/bin/tput ]
    then
        tput bold
        tput setaf $1
    fi
    shift
    printf -- "$@"
    if [ -x /usr/bin/tput ]
    then
        tput sgr0
    fi
}

highlight_error()
{
    highlight 1 "$@"
}

PS1='$(print_error_if_error)'

# ...

if [ "$USER" = 'root' ]
then
    PS1="${PS1}$(highlight_error '\u')"
else
    PS1="${PS1}\u"
fi

답변2

바라보다이 문제변수를 사용한 솔루션 $PROMPT_COMMAND. 각각의 새로운 프롬프트가 표시되기 전에 호출될 함수의 이름을 작성하세요. 함수에서 색상 명령을 설정 하면 PS1문제를 해결하고 함수에서 색상 명령을 사용할 수 있습니다 .

# ... Using your highlight and highlight_error functions ...

prompt(){
    exit_code=${?}
    PS1="\u@\h \$ "
    if [[ $exit_code != 0 ]];then
        PS1="$(highlight_error "($exit_code)") $PS1"
    fi
}

PROMPT_COMMAND="prompt"

관련 정보