在随后的bash提示符中包括非0退出代码
偶尔,我会运行一个有很多输出的命令。偶尔,该输出的最后30-40行(也就是我真正看到的输出的唯一部分)是正常的,但更进一步,出现了一个错误。我想让大家更容易注意到命令失败了。为此,我希望返回代码成为提示符的一部分。所以我拿了我的$PS1:在随后的bash提示符中包括非0退出代码,bash,command-prompt,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
[\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的内置组件重很多。有点
printf
滥用:
printf '%.*s' $? $?
这是我在工作中使用的方法,可以得到一个带有退出代码的红色数字。冗长,但它完成了任务,应该是可移植的
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)...'
您可以使用bash的内置模式匹配:
$ rc=0
$ echo ${rc##0}
$ rc=123
$ echo ${rc##0}
123
您可以在PS1中放置一条if语句,该语句仅在退出状态为非零时才回显:
PS1='[\D{%Y-%m-%d} \t] $(es=$?; if [ $es -ne 0 ]; then echo $es; fi) \[\e]0;\u@\h: \w\a\]\$'
以下是我的作品:
PS1=“[\D{%Y-%m-%D}\t]\u@\h:\w\a\${?##0}\$”
例如,当$?是0:
一种常见的方法是使用
trap。。。在命令失败时执行任意代码时出错:
$ trap 'echo $?' ERR
$ true
$ false
1
$
一个典型的UNIX恶作剧是'echo You have new mail'。ERR
对于zsh用户:将此插入您的提示符:%(?,-%?-)
这是我使用的提示符,插入.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
单引号示例:
PS1='${?#0}>'
双引号示例(注意额外的反斜杠以转义$
)
PS1=“\${?\0}>”
样本输出:
> echo 'ok'
ok
> bogus
bogus: command not found
127>
说明:${var#pattern}
是一个bash参数扩展,它意味着从$var前面删除最短的匹配模式。因此,在本例中,我们从$?
前面删除0
,这将有效地截断0
的退出代码
如果使用双引号,
$?
将在设置了PS1
时被替换,而不是每次进行计算。执行echo$PS1
以确认在PS1
中没有硬编码值这也是我的第一个想法,但我拒绝了它,认为它只会去除任何0,但当然不是这样。这似乎奏效了。唯一的缺点是在0退出代码的情况下会有多余的空间。如果你想了解更多关于这方面的信息,请查看子字符串删除部分中的“这两种方法都有效”并让我发笑。我喜欢。我稍微扩展了它:printf'%s%'%s'$?$?'
这使得它仅在非零时添加一个空格。为了便于使用,在primpt中使用$(foo)只计算foo一次(而不是在每个命令中)。请参阅以了解如何解决此问题。说明:这是我使用的方法,因为它允许使用else
子句。请注意将$?
复制到局部变量的重要性,因为[
将在到达回显
之前覆盖它。交叉重复:
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
> echo 'ok'
ok
> bogus
bogus: command not found
127>