偶尔,我会运行一个输出很多的命令。偶尔,输出的最后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内置的东西重得多。
答案 0 :(得分:12)
一点printf
滥用:
printf '%.*s' $? $?
答案 1 :(得分:8)
以下适用于我:
PS1="[\D{%Y-%m-%d} \t] \u@\h:\w\a \${?##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
[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
中没有硬编码值。