Как изменить цвет приглашения bash в зависимости от кода выхода последней команды?

Я хочу отобразить зеленое улыбающееся лицо, если предыдущий код выхода равен 0, и красное улыбающееся лицо, если не удалось.

В основном я хочу сделать это, но с другими вещами включены.

PS1='\u@\h:\w `if [ $? = 0 ]; then echo \[\e[32m\]:\)\[\e[37m\]; else echo \[\e[31m\]:\(\[\e[37m\]; fi` $ '

Я хочу абстрагировать логику условий в функции, но когда я пытаюсь объединить эти два символа, вместо цветов отображаются экранирующие символы.

smiley()                                                                       
{
    if [ $? == 0 ]; then
        echo ':)'
    else
        echo ':('
    fi
}
RED="\033[1;5;91m"
GREEN="\033[1;5;92m"
NONE="\033[m"
NORMAL="\[\033[0m\]"
YELLOW="\[\033[1;4;93m\]"
MAGENTA="\[\033[35m\]"
WHITE="\[\033[1;37m\]"
BLINK="\[\033[5m\]"
#INVERT="\[\e[7m\]"
#OFF="\[\033[m\]"

PS1="${YELLOW}\u${MAGENTA}@${YELLOW}\h${NORMAL}:${WHITE}\w $(smiley)\n"

Я даже попробовал одну строчку, но она тоже не сработала.

 PS1='\[\033[1;4;93m\]\u\[\033[35m\]@\[\033[1;4;93m\]\h\[\033[0m\]\[\033[1;37m\]    \W if [ $? = 0 ]; then echo \[\e[32m\]:\)\[\e[37m\]; else echo \[\e[31m\]:\(\[\    e[37m\]; fi\n'

Есть ли способ сделать это без PROMPT_COMMAND?

1 ответ

Решение

Я предполагаю, что ваша цитата не верна. Я немного поиграл с этим и наконец заработал:

$ bash --version
GNU bash, version 4.4.12(3)-release (i686-pc-cygwin)

$ smiley()
> {
>   if [ "$?" == "0" ]; then
>     echo -e '\e[0;32m:) '
>   else
>     echo -e '\e[0;31m:( '
>   fi
> }

$ PS1="$PS1"'`smiley`'

$ :) rm non-existing
rm: cannot remove 'non-existing': No such file or directory

$ :( echo "Everything fine"
Everything fine

$ :)

Я сделал это на Windows (64-битной), но я думаю, что это должно работать и на Linux (или любом другом Unix-подобном).

Заметки:

  1. Я написал функцию smiley() (упрощенная версия вашего) и проверил его, вызвав его из командной строки. Работало нормально.

  2. Я добавил это в PS1 и это повторило :) в любом случае. Я понял, что замена bash уже была сделана в назначении PS1,

  3. Таким образом, я сохранил призыв smiley дополнительной парой одинарных кавычек, чтобы отложить вызов до вывода приглашения. Теперь это работает как ожидалось.

  4. Поскольку спрашивающему требовалась цветная версия, я сделал обновление. Фактическое решение я нашел по этой ссылке: SO: Как изменить цвет вывода echo в Linux. Легко найти необходимые конечные escape-последовательности. Хитрость заключается в использовании echo -e чтобы включить обратную косую черту, выходящую в echo,

Снимок ниже показывает, как это выглядит (с цветами):

Снимок <code> bash </ code> с настроенным приглашением в <code> xterm </ code bash с настроенным приглашением в xterm

Это работает для меня:

export PS1="\
\$(if [[ \$? -gt 0 ]]; then printf \"\\[\\033[01;31m\\]\xF0\x9F\x98\xA7\"; else printf \"\\[\\033[01;32m\\]\xF0\x9F\x98\x83\"; fi)\
\[\033[01;30m\]\u\
\[\033[01;33m\]@\
\[\033[01;36m\]\h \
\[\033[01;33m\]\w \
\[\033[01;31m\][\$(__git_ps1 '%s')] \
\[\033[01;35m\]\\$ \
\[\033[00m\]\
"

Я адаптировал ответ Майкла А для.bashrc файл (в моем случае git-for-windows)

PS1='\
`if [[ $? -gt 0 ]]; then printf "\[\033[01;31m\]:("; else printf "\[\033[01;32m\]:)"; fi`\
\[\033]0;$TITLEPREFIX:$PWD\007\] \
\[\033[32m\]\u@\h \
\[\033[33m\]\w\
\[\033[36m\]`__git_ps1`\
\[\033[0m\]\n$'

Для справки значение по умолчанию:

PS1='\
\[\033]0;$TITLEPREFIX:$PWD\007\]\n\
\[\033[32m\]\u@\h\
\[\033[35m\] $MSYSTEM \
\[\033[33m\]\w\
\[\033[36m\]`__git_ps1`\
\[\033[0m\]\n$'
Другие вопросы по тегам