我运行以下命令:
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 true
或while 0
。因此,如果emacs
返回另一个值,就像1
它被杀死一样,则循环结束。