比较退出状态不起作用

时间:2013-03-13 12:10:11

标签: bash

我正在尝试自定义我的bash提示符。如果我输入一个不存在的命令,或者由于某些其他原因失败,我想要它改变颜色。我对编码bash脚本相当新,所以我查看了一些其他脚本以获得一些帮助,但有些东西不起作用。这是我的代码:

export PROMPT_COMMAND="
    PS1='`
        if [ $? -eq 0 ];
            then echo '
                \[\033[00;32m\]┌─\[\033[00;35m\]\u\[\033[01;32m\]@
                \[\033[00;35m\]\h\n\[\033[00;32m\]└─\[\033[01;32m\]
                (\[\033[01;35m\]\W\[\033[01;32m\])\[\033[00;32m\]\$';
         else echo '
                \[\033[00;31m\]┌─\[\033[00;35m\]\u\[\033[01;31m\]@
                \[\033[00;35m\]\h\n\[\033[00;31m\]└─\[\033[01;31m\]
                (\[\033[35m\]\W\[\033[31m\])\[\033[00;31m\]\$';
         fi`\[\033[0m\]'"

我在实际代码中没有任何换行符,因为PS1会很麻烦,我只是添加它们以使代码更容易阅读。

所以,我想将退出状态 $? 0 进行比较。由于某种原因变量$?在脚本中根本不会改变。它只是 0 ,因此即使我发出错误命令,第一个条件也始终为真。我尝试将 echo $?添加到if-case之前的代码中,并且这总是返回0,即使将 echo $?作为命令发送到终端返回有些不同。我已经尝试将工作代码复制到我的工作中,但这也无法解决。此外,当我使用'作为外部引文时,它也有效。作为第二个。我改变了这一点,因为脚本不接受否则就是一个角色。

为什么会这样,以及如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

您的代码中的问题是您的报价已被破坏:

export PROMPT_COMMAND="
PS1='`
    if [ $? -eq 0 ];
        then echo '

一般来说它应该可行,试试这个:

PS1='`if [ $? -eq 0 ] ; then echo Y:; else echo N:; fi`

以下是应用代码后的输出:

$ PS1='`if [ $? -eq 0 ] ; then echo Y:; else echo N:; fi`'
Y:
Y:
Y:
Y:false
N:
N:
N:true
Y:
Y:

注意:只需按 ENTER 键,就不会改变提示。

答案 1 :(得分:0)

就像H.-Dirk Schmitt的回答一样,这对我有用(我不打算解释代码,这已经比我做得更好了);

PS1='`
  if [ $? -eq 0 ];
    then echo -n "\[\033\[00;35m\]\u\[\033\[01;32m\]@\[\033\[00;35m\]\h\[\033\[00;32m\](\[\033\[01;35m\]\W\[\033\[01;32m\])\[\033\[00;32m\]\$";
    else echo -n "\[\033\[00;35m\]\u\[\033\[01;31m\]@\[\033\[00;35m\]\h\[\033\[01;31m\](\[\033\[35m\]\W\[\033\[31m\])\[\033\[00;31m\]\$";
  fi`\[\033\[0m\]'

bash colours