Parece que qualquer seqüência de escape realmente em PS1
literalmente precisa ser agrupada em \[
e \]
, mas se você chamar uma função ou comando que produza saída, ela não precisará ser quebrada.
Então, por que não apenas mover o
"\$(exit_code=\${?#0}
highlight_error \"\${exit_code}\${exit_code:+ }\")"
material dentro de uma função, por exemplo
print_error_if_error()
{
exit_code=$?
if [ $exit_code -ne 0 ]; then
highlight_error "$exit_code "
fi
}
e, em seguida, acho que você pode remover todas as coisas \[
e \]
...
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