打破命令循环但退出代码不是原因?

打破命令循环但退出代码不是原因?

我运行以下命令:

echo "while emacs;do echo $?;done;echo Exit code: $?;" | bash

如果我通过菜单或关闭按钮退出 emacs,它会打印退出代码 0 并重新启动。

如果我通过输入 (kill-emacs 1) ctrl-x ctrl-e 退出 emacs

Emacs 被终止,循环也被终止,但退出代码仍然是 0。

是什么导致它跳出循环?

更新:根据 pqnet 的建议,我改用单引号,代码现在如下:

echo 'while emacs;do echo Exit code: $?;done;echo "Exit code: $?";echo "Loop End."' | bash

这会产生相同的结果。我假设我需要在 while 循环中保存 pid 的值。所以我尝试:

echo 'while epid=$(emacs);do echo Exit code: $epid;done;echo "Exit code: $epid";echo "Loop End."' | bash

如果这些结果是可信的,那么两种情况下的退出代码都是空字符串(或不可见的二进制文件),但我认为这也不正确?我对“返回值”是退出代码的假设是否不正确,或者只是 epid 没有捕获它?

更新:其中一个答案解释了为什么我没有得到预期的结果,但现在我很想知道什么代码可以让我查看 emacs 的退出代码,因为我想出的都没有这样做。

答案1

实时FM:

尽管

该命令的语法while是:

同时测试命令;执行后续命令;完毕

执行后续命令只要测试命令退出状态为零。返回状态是最后执行的命令的退出状态后续命令,如果没有执行则为零。

如果你想获取返回值测试命令,您需要将其显式分配给另一个变量:

#!/bin/bash

while
        emacs
        ret=$?
        ((ret == 0))
do
        echo "Exit code: $ret"
done
echo "Exit code: $ret"
echo "Loop End."

答案2

您的while循环评估布尔值。在这种情况下,您也可以将其读作while truewhile 0。因此,如果emacs返回另一个值,就像1它被杀死一样,则循环结束。

相关内容