Bash

打破命令循環但退出程式碼不是原因?

  • February 4, 2019

我執行以下命令:

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 的退出程式碼,因為我想出的東西都沒有。

實時調頻

儘管

while命令的語法是:

同時測試命令;執行後續命令;完畢

只要test-commands的退出狀態為零,就執行consequent-commands 。返回狀態是consequent-commands中執行的最後一個命令的退出狀態,如果沒有執行,則返回零。

如果要從test-commands獲取返回值,則需要將其顯式分配給另一個變數:

#!/bin/bash

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

引用自:https://unix.stackexchange.com/questions/213739