いくつかのコードをテストするために Bash でスクリプトを書いています。ただし、そもそもコードのコンパイルに失敗した場合にテストを実行するのはばかげているように思われます。その場合は、テストを中止します。
スクリプト全体を while ループ内にラップしてブレークを使用せずにこれを行う方法はありますか? ドンドンドンゴトみたいなもの?
set -eを使用
#!/bin/bash
set -e
/bin/command-that-fails
/bin/command-that-fails2
スクリプトは、失敗した最初の行の後に終了します (0 以外の終了コードを返します)。この場合、command-that-fails2は実行されません。
すべてのコマンドの戻りステータスを確認する場合、スクリプトは次のようになります。
#!/bin/bash
# I'm assuming you're using make
cd /project-dir
make
if [[ $? -ne 0 ]] ; then
exit 1
fi
cd /project-dir2
make
if [[ $? -ne 0 ]] ; then
exit 1
fi
set -eを使用すると、次のようになります。
#!/bin/bash
set -e
cd /project-dir
make
cd /project-dir2
make
コマンドが失敗すると、スクリプト全体が失敗し、$?で確認できる終了ステータスが返されます。. スクリプトが非常に長い場合、または多くのものを作成している場合、リターン ステータス チェックをあらゆる場所に追加すると、かなり見苦しくなります。
多くの場合、エラーを処理するために run() という関数を含めます。実行したい呼び出しはすべてこの関数に渡されるため、障害が発生するとスクリプト全体が終了します。set -e ソリューションに対するこの利点は、回線が失敗したときにスクリプトが黙って終了せず、問題が何であるかを知らせることができることです。次の例では、false の呼び出しでスクリプトが終了するため、3 行目は実行されません。
function run() {
cmd_output=$(eval $1)
return_value=$?
if [ $return_value != 0 ]; then
echo "Command $1 failed"
exit -1
else
echo "output: $cmd_output"
echo "Command succeeded."
fi
return $return_value
}
run "date"
run "false"
run "date"