如何根据最后一个命令的退出代码更改bash提示颜色?

时间:2017-03-25 10:50:54

标签: 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,有没有办法做到这一点?

3 个答案:

答案 0 :(得分:3)

我认为你的报价不正确。我用这个摆弄了一下,最后让它发挥作用:

$ 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. 时完成了
  4. 因此,我通过一对额外的单引号来调用smiley,以推迟调用直到输出提示。现在,它的工作方式与预期相符。

  5. 因为提问者需要彩色版本,我进行了更新。我在此链接中找到了实际解决方案:SO: How to change the output color of echo in Linux。很容易找到必要的终端逃逸序列。诀窍是使用echo -e来启用echo中的反斜杠转义。

  6. 下面的快照显示了它的外观(带颜色):

    Snapshot of <code>bash</code> with tuned prompt in an <code>xterm</code>

答案 1 :(得分:0)

这对我有用:

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\]\
"

答案 2 :(得分:0)

我将Michael A的answer修改为一个.bashrc文件(在我的情况下是git-for-windows)

git bash rc screenshot

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$'