&&/ || の複合コマンド状態

&&/ || の複合コマンド状態

私はこれが一般的な質問であることを知っており、以前にこれに対する答えを見たことがありますが、それが何であるか覚えておらず、見つけることもできません。

#!/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

関連情報