Как изменить цвет приглашения 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-подобном).
Заметки:
Я написал функцию
smiley()
(упрощенная версия вашего) и проверил его, вызвав его из командной строки. Работало нормально.Я добавил это в
PS1
и это повторило:)
в любом случае. Я понял, что замена bash уже была сделана в назначенииPS1
,Таким образом, я сохранил призыв
smiley
дополнительной парой одинарных кавычек, чтобы отложить вызов до вывода приглашения. Теперь это работает как ожидалось.Поскольку спрашивающему требовалась цветная версия, я сделал обновление. Фактическое решение я нашел по этой ссылке: SO: Как изменить цвет вывода echo в Linux. Легко найти необходимые конечные escape-последовательности. Хитрость заключается в использовании
echo -e
чтобы включить обратную косую черту, выходящую вecho
,
Снимок ниже показывает, как это выглядит (с цветами):
Это работает для меня:
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$'