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

Cha*_*har 5 bash

如果之前的退出代码为 0,我想显示绿色笑脸,如果不成功则显示红色笑脸。

基本上我想做这个提示,但包括其他东西。

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

我想将条件逻辑抽象为一个函数,但是当我尝试将这两个组合在一起时,会显示转义字符而不是颜色。

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"
Run Code Online (Sandbox Code Playgroud)

我什至尝试了一条线,但它也不起作用。

 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'
Run Code Online (Sandbox Code Playgroud)

如果没有 PROMPT_COMMAND 有什么办法可以做到这一点?

Sch*_*eff 5

我认为您的引用不正确。我摆弄了一下这个,终于让它工作了:

$ 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

$ :)
Run Code Online (Sandbox Code Playgroud)

我在 Windows(64 位)上做了这个,但我想它也应该在 Linux(或任何其他类似 Unix 的)上工作。

笔记:

  1. 我编写了一个函数smiley()(您的函数的简化版本)并通过从命令行调用它来检查它。效果很好。

  2. 我添加了它,无论如何PS1它都会回响。:)我意识到 bash 替换已经在PS1.

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

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

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

<code>xterm</code> 中带有调整提示的 <code>bash</code> 快照