【问题标题】:How to change bash prompt color based on exit code of last command?如何根据最后一个命令的退出代码更改 bash 提示颜色?
【发布时间】:2017-03-25 10:50:53
【问题描述】:

如果之前的退出代码为 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 有什么方法可以做到这一点?

【问题讨论】:

  • 笑脸作为状态指示器是个好主意!我使用了{0}{1},但现在改成这个了。
  • PS1='\[\e[$([[ $? = 0 ]] && printf 32 || printf 31);1m\]^^^\[\e[m\] ${debian_chroot:+($debian_chroot)}\[\e[1;31m\]\u\[\e[1;33m\]@\[\e[1;36m\]\h \[\e[1;33m\]\w \[\e[1;35m\]\$ \[\e[0m\]' 它将在提示符的开头打印 ^^^ 红色或绿色。此外,您将拥有漂亮多彩的用户、主机、路径 :)

标签: bash


【解决方案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 并且在任何情况下都回显了 :)。我意识到在 PS1 的分配中已经完成了 bash 替换。

  3. 因此,我用一对额外的单引号保护了smiley 的调用,以将调用推迟到提示符的输出。现在,它按预期工作了。

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

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

【讨论】:

  • 你让它与颜色一起工作吗?绿色代表笑脸,红色代表皱眉?
  • 这太棒了!为什么你在函数调用中使用反引号? smiley 和 $(smiley) 有区别吗?
  • @Charles 您将在man bash 中找到确切的答案。我相信$( ) 是新的(并且可能是嵌套的)。反引号是旧的,可​​能没有嵌套。 (如果您在手册页中阅读了其他内容,请纠正我。)
  • This 建议您是正确的,它们都进行替换,但不推荐使用反引号,因为它们不是 POSIX 标准。此外,他们会根据该答案默默地删除双引号。
  • 代替rm non-existingecho .. 进行测试,您可以只使用truefalse 命令
【解决方案2】:

这对我有用:

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

【讨论】:

    【解决方案3】:

    我将 Michael A 的 answer 改编为 .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$'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-19
      • 2017-06-20
      相关资源
      最近更新 更多