私はこれが一般的な質問であることを知っており、以前にこれに対する答えを見たことがありますが、それが何であるか覚えておらず、見つけることもできません。
#!/usr/bin/env bash
set -m # allow for job control
EXIT_CODE=0 # exit code of overall script
function foo() {
for job in `jobs -p`; do
echo "PID => ${job}"
wait ${job} || { echo "At least one test failed with exit code => $?" ; EXIT_CODE=1; }
done
}
trap 'foo' CHLD
私の問題は次の行に関連しています。
wait ${job} || { echo "At least one test failed with exit code => $?" ; EXIT_CODE=1; }
ゼロ以外の終了コードが生成されたら、wait ${job}
ステートメントをエコーして割り当てを実行したいと思います(に1割り当てEXIT_CODE
)。
私は文法が正しいとは思わない。明らかなエラーは発生しませんが、ステートメントが応答を受け取らないため、それが間違っていると確信しています。しかし、まだ終了コード1で終了します。
答え1
wait
ゼロ以外の終了状態で終了しましたか?たとえば、次のことを考えてみましょう。
false || { echo "At least ..."; EXIT_CODE=1; }
これによりメッセージが生成され、EXIT_CODE
適切に設定されます。
私は最初にこれがあなたが探しているものだと思いました。
wait ${job} || ( echo "At least ..."; EXIT_CODE=1 )
このアプローチの問題は、その内容がサブシェル(...)
で実行されることです。値への変更はEXIT_CODE
そのサブシェルに限定されます(つまり、後で読み取ろうとすると表示されません)。
たとえば、次のことを考えてみましょう。
EXIT_CODE=0
false || ( echo "At least ..." ; EXIT_CODE=1; echo "code: ${EXIT_CODE}" )
echo "final code: ${EXIT_CODE}"
出力は次のとおりです。
At least ...
code: 1
final code: 0
あまりにも華やかに飾ろうとしないことをお勧めします。
if ! wait ${job}; then
echo "At least ..."
EXIT_CODE=1;
fi