Скобки переEscape в PS1

Если Вы только ищете внешние программы, можно также использовать который. Не знайте, как портативный, который является все же.

5
12.04.2011, 22:22
2 ответа

Кажется что любая 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
4
27.01.2020, 20:41
  • 1
    подсказки Ага, который объясняет, почему он работал до сих пор.Спасибо! –  l0b0 12.04.2011, 14:10
  • 2
    Ай, оказывается, что это только работает из-за \n в моем PS1. Если я удалю его, то мой вход наложится как перед :( –  l0b0 08.07.2011, 12:09

См. этот вопрос 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"
0
27.01.2020, 20:41

Теги

Похожие вопросы