コマンドループが中断されましたが、終了コードが理由ではありませんか?

コマンドループが中断されましたが、終了コードが理由ではありませんか?

次のコマンドを実行します。

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

メニューまたは閉じるボタンでemacsを終了すると、終了コード0が印刷され、再起動されます。

(kill-emacs 1) ctrl-x ctrl-e を入力して emacs を終了すると

Emacsが終了し、ループも終了しますが、終了コードはまだゼロです。

ループから抜け出す原因は何ですか?

更新: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

これらの結果を信じる必要がある場合、どちらの場合も終了コードは空の文字列(または見えないバイナリ)ですが、それも正しいとは思いませんか? 「戻り値」は終了コードが間違っていると仮定していますか、それともそれをキャッチできませんか?

更新:答えの1つは期待した結果が得られなかった理由を説明しましたが、今ではどのコードを使用してemacsの終了コードを見ることができるのか疑問に思います。なぜなら、私が思いついたコードのどれもそうしないからです。 。

答え1

リアルタイムFM:

しかし、

このコマンドの構文は次のwhileとおりです。

同時にコマンドをテストし、完了した後続のコマンドを実行します。

実装する後続のコマンドをするテストコマンド終了状態は 0 です。戻り状態は、最後に実行されたコマンドの終了状態です。後続のコマンド、または実行されない場合は0です。

戻り値を取得したい場合テストコマンド、他の変数に明示的に割り当てる必要があります。

#!/bin/bash

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

答え2

ループwhileはブール値を評価します。この場合、while trueorでも読み取ることができますwhile 0。したがって、emacsまるで終了したかのように他の値が返されると、1ループは終了します。

関連情報