"&& vs if [ $? -ne 0 ] vs set -e" は子プロセスを管理します。

複数のステップシェルを同時に呼び出すメインシェルを作成しました。

#!/bin/bash
##I'm the master shell and I'm super important. I should never fail to log.

bash ./step1.sh
bash ./step2.sh
bash ./step3.sh
bash ./step4.sh

...

次のシェルを呼び出す前に、ステップシェルは失敗しないでください。
私はこれを行う3つの方法を考えていますが、実際にはその方法が正確に何であるかわかりません。

方法1)

bash ./step1.sh &&
bash ./step2.sh &&
bash ./step3.sh &&
bash ./step4.sh &&
...

方法2)

bash ./step1.sh 

if [ $? -eq 0 ]; then
  bash ./step2.sh 
fi

if [ $? -eq 0 ]; then
  bash ./step3.sh
fi

if [ $? -eq 0 ]; then
    bash ./step4.sh
fi
...

方法3)

set -e
bash ./step1.sh
bash ./step2.sh
bash ./step3.sh
bash ./step4.sh
...
set +e

スクリプトのいずれかが失敗した場合は、すぐに終了する基本スクリプトが必要になり、step失敗したステップを記録できるはずです。

どちらが最も好まれ、どちらが最も安全ですか?

ベストアンサー1

「最も安全な」行動はさておき、どのような振る舞いが「安全で」「望む」のかは、スクリプトが何をしているのか分からないことだと言ったことがないので、望むことを達成する「より良い」方法があるかもしれません。

set -e基本スクリプトを終了する前に個々のステップの1つで失敗を記録する必要があるため、実際には以下のチェーンのステップまたはこれらのステップの間のステップを実行することはできません&&。つまり、stepスクリプト自体が失敗を記録しない限りです。

基本スクリプトが失敗を記録する必要があるとしましょう。デフォルトのスクリプトは次のスクリプトを実行し、失敗を検出できる必要があります。その後、終了する前にユーザーにこのエラーを通知する必要があります。

私はおそらく2番目のアプローチのバリエーションを選択します。

#!/bin/bash

for step in {1..4}; do
    if ! bash "./step$step.sh"; then
        printf 'Step %s failed, terminating...\n' "$step" >&2
        exit 1
    fi
done

echo 'All done, no failures'

このループは整数 1 から 4 まで繰り返し、各繰り返しに対して適切なスクリプトを実行します。スクリプトが失敗すると、ユーザーに診断メッセージを記録し、ゼロ以外の終了状態で終了します。

整数を繰り返すのではなく、明らかに使用できます。

#!/bin/sh

for script in ./step*.sh; do
    if ! bash "$script"; then
        printf 'Script "%s" failed, terminating...\n' "$script" >&2
        exit 1
    fi
done

echo 'All done, no failures'

...実際のステップスクリプトを繰り返します(ファイル名のグロービングから返された順序で返されます)。または

#!/bin/bash

for script in ./step{1..4}.sh; do
    if ! bash "$script"; then
        printf 'Script "%s" failed, terminating...\n' "$script" >&2
        exit 1
    fi
done

echo 'All done, no failures'

スクリプトの正確な順序をよりよく制御できます(特にスクリプトが9つ以上の場合)。

おすすめ記事