サブコマンドのエラーが発生したときに Bash の for ループが終了しない問題を回避するにはどうすればよいですか?

サブコマンドのエラーが発生したときに Bash の for ループが終了しない問題を回避するにはどうすればよいですか?

シェル スクリプトに次のような for ループがあります:

#!/bin/bash
set -u
set -e
for l in sh rb py php java cs; do
  (cd $l; ./run-tests.sh)
done

目的は、サブコマンドのいずれかが同様にエラーになったときに、for ループを強制終了させることです。

これで、回避策ができました。(cd $l; ./run-tests.sh) || die "Message here"の適切な定義もdieできました。しかし、なぜ for ループが "set -e" コマンドで設定された期待どおりに自己終了しないのか、本当に不思議です。理想的には、すべての for ループをそのように特別扱いしないようにしたいと思います。 :)

答え1

set -e失敗した場合にすぐに終了しない理由は./run-test.sh、次の行です:

for l in sh rb py php java cs; do
  (cd $l; ./run-tests.sh)
done

複合文の場合。この複合文のステータスは、 の最後の実行のステータスになります./run-tests.sh

あなたの回避策は良いと思います。

答え2

コメント権限がないので、ここに投稿します。run-tests.sh のスクリプトに依存します。これでゼロ以外の値が返されるのは確かですか?

./run-tests.sh

$をエコーし​​ますか?

関連情報