Если Вы только ищете внешние программы, можно также использовать который. Не знайте, как портативный, который является все же.
Кажется что любая escape-последовательность на самом деле в 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
См. этот вопрос SO для решения, использующего переменную $ 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"
\n
в моемPS1
. Если я удалю его, то мой вход наложится как перед :( – l0b0 08.07.2011, 12:09