在随后的bash提示符中包含非0退出代码

时间:2011-05-10 07:52:02

标签: bash command-prompt

偶尔,我会运行一个输出很多的命令。偶尔,输出的最后30-40行(也就是我真正看到的输出的唯一部分)很好,但更进一步,出现了错误。我想更容易注意到命令失败了。为此,我希望返回代码成为我的提示的一部分。所以我拿了我的$ PS1:

[\D{%Y-%m-%d} \t] \[\e]0;\u@\h: \w\a\]\$

......并将其扩展到:

[\D{%Y-%m-%d} \t] ${?/^0$/} \[\e]0;\u@\h: \w\a\]\$

这会产生如下提示:

[2011-05-10 09:38:07] 0 soren@lenny:~$ 

但是,我想找到一种方法让它只包含退出代码,如果它不是0。我怎样才能做到这一点?当然,我可以使用

$(echo \$? | sed -e blah)

但是像sed一样轻巧,它的重量仍然比bash内置的东西重得多。

9 个答案:

答案 0 :(得分:12)

一点printf滥用:

printf '%.*s' $? $?

答案 1 :(得分:8)

以下适用于我:

PS1="[\D{%Y-%m-%d} \t] \u@\h:\w\a \${?##0} \$ "

例如$?是0:

[2011-07-25 11:56:57] plars@plars-t500:~  $<br>
there is an extra space there ---------^^ not sure if that's a problem for you

例如$?是130:

[2011-07-25 11:57:39] plars@plars-t500:~ 130 $

答案 2 :(得分:6)

您可以使用bash的内置模式匹配:

$ rc=0
$ echo ${rc##0}

$ rc=123
$ echo ${rc##0}
123

答案 3 :(得分:4)

以下是我在.bashrc中使用退出代码获取红色数字的内容。详细,但它完成了工作,应该是可移植的。

highlight()
{
    if [ -x /usr/bin/tput ]
    then
        tput bold
        tput setaf $1
    fi
    shift
    printf -- "$@"
    if [ -x /usr/bin/tput ]
    then
        tput sgr0
    fi
}

highlight_error()
{
    highlight 1 "$@"
}

highlight_exit_code()
{
    exit_code=$?
    if [ $exit_code -ne 0 ]
    then
        highlight_error "$exit_code "
    fi
}

PS1='$(highlight_exit_code)...'

答案 4 :(得分:4)

您可以在PS1中放置一个if语句,只有当它不为零时才会回显退出状态:

PS1='[\D{%Y-%m-%d} \t] $(es=$?; if [ $es -ne 0 ]; then echo $es; fi) \[\e]0;\u@\h: \w\a\]\$'

答案 5 :(得分:3)

执行此操作的常用方法是在命令失败时使用trap ... ERR执行任意代码:

 $ trap 'echo $?' ERR
 $ true
 $ false
1
 $

一个典型的UNIX实用笑话是trap 'echo You have new mail.' ERR

答案 6 :(得分:1)

对于zsh用户:将其插入您的PROMPT:%(?,, -%?-)

答案 7 :(得分:1)

这是我使用的提示,插入.bashrc并使用它来获取它。正如您所看到的,只有在值不为0的情况下才将PREV_RET_VAL附加到PS1。

COLOR_RED_BOLD="\[\e[31;1m\]"
COLOR_GREEN_BOLD="\[\e[32;1m\]"
COLOR_NONE="\[\e[0m\]"

# prompt function
promptFunc()
{
PREV_RET_VAL=$?;

PS1=""

PS1="${PS1}\e[1;30m[\e[1;34m\u@\H\e[1;30m:\e[0;37m \e[0;32m\d \T\e[1;30m]\e[1;37m \w\e[0;37m\[\033]0; \w - \u@\H \007\]\n\[\] "

if test $PREV_RET_VAL -eq 0
then
    PS1="${PS1}${COLOR_GREEN_BOLD}\\$ ${COLOR_NONE}"
else
    PS1="${PS1}${COLOR_RED_BOLD}\\$ [${PREV_RET_VAL}] ${COLOR_NONE}"
fi
}

PROMPT_COMMAND=promptFunc

答案 8 :(得分:0)

单引号示例:

PS1='${?#0}> '

双引号示例(注意额外的反斜杠以逃避$

PS1="\${?#0}> "

示例输出:

> echo 'ok'
ok
> bogus
bogus: command not found
127> 

说明:${var#pattern}是一个bash参数扩展,意味着从$ var的前面删除最短的匹配模式。因此,在这种情况下,我们会从0的前面删除$?,这会有效截断0的退出代码。

如果使用双引号,$?将在设置PS1时被替换,而不是每次都被评估。请echo $PS1确认您在PS1中没有硬编码值。