Bash的退出状态始终为0。

6
我遇到了一个奇怪的问题,即使执行不成功,我的退出状态也总是返回0。
我想在我的提示符上输出退出状态,使用以下代码:
function status() {
    echo $?
}

export PS1="\$(status)>"

当我运行这个程序时,我得到了以下的输出结果。
 0❯ pwd
/Users/tringuyen
 0❯ ad
bash: ad: command not found
 0❯ echo $?
127

显然,倒数第二个命令ad没有返回一个0状态码。不过控制台却是这样显示的。有人知道这里可能出了什么问题吗?
编辑于6/20 11:57AM: 问题似乎是$?始终为0,除非.bashrc文件本身出现错误,将导致其返回与0不同的值。

3
我测试了这段代码,似乎没有问题。我的 $BASH_VERSION 版本为 4.2.20(1)-release - IMSoP
3
对我来说这很好用,只需要这样做 PS1="\$?>" 就足够了。 - Grzegorz Żur
1
出于兴趣,我的提示符定义如下(部分内容):export PS1='$(RET=$?; if [ $RET == 0 ]; then echo "\[\033[1;30m\]$RET"; else echo "\[\033[0;31m\]$RET"; fi;) \[\033[1;32m\]\u@\h',如果最后的返回状态为非零,则以红色显示,如果为零,则以灰色显示。(将其捕获到 $RET 中避免了其他逻辑在我们回显之前覆盖 $?。) - IMSoP
1
@IMSoP 我的 $BASH_VERSION3.2.48(1)-release。我正在使用最新的 OS X Mountain Lion 操作系统。 - Tri Nguyen
1
嗯,这不仅仅是版本的问题 - 我在 3.2.33(1)-release 上也得到了相同(成功的)结果。这两个都是 Gentoo Linux 系统,所以可能有其他不同之处。另一个可能性是您设置了另一个特殊变量(例如 $PS2$PROMPT_COMMAND),它以某种方式覆盖了 $? - IMSoP
显示剩余9条评论
3个回答

1
以下内容是否适用于您的bash版本?
export PS1="\$?>"

0
我也遇到了类似的问题,但我的函数看起来不同。问题是,在VAR=$?之后我漏掉了分号“;”。
旧代码:
function status() {
   VAR=$?
   echo $VAR
}

无论如何始终返回零。

新:

function status() {
   VAR=$?;
   echo VAR;
}

现在返回了正确的返回值。

export PS1="\$(status)>"

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接