次のコマンドを実行します。
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
しかし、
このコマンドの構文は次の
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 true
orでも読み取ることができますwhile 0
。したがって、emacs
まるで終了したかのように他の値が返されると、1
ループは終了します。