~처럼다른 사람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"