ソース コードに対して 3 つのチェックをexit 0
実行し、すべてのコマンドが成功したかexit 1
、いずれかのコマンドが失敗したかどうかを確認する bash スクリプトがあります。
#!/bin/bash
test1 ./src/ --test-1=option
exit_1=$?
test2 ./src/ test-2-options
exit_2=$?
test3 ./src/ -t 3 -o options
exit_3=$?
# Exit with error if any of the above failed
[[ $exit_1 -eq 0 && $exit_2 -eq 0 && $exit_3 -eq 0 ]]
exit $?
このコードは機能しますが、長すぎて冗長に感じます。これをより良くする方法はありますか?具体的には、私は満足していません:
- コマンドを実行し、終了コードを変数に割り当てる必要がある
- を使用し
[[ ... ]]
、次の行で終了コードを収集して終了する必要があります [[ $var -eq 0 ]]
のように、変数をブール値として扱うのではなく、変数を明示的に 0 と比較する必要がある
理想的には、最終結果は次のような読みやすいものになります。
exit_1=( test1 ./src/ --test-1=option )
exit_2=( test2 ./src/ test-2-options )
exit_3=( test3 ./src/ -t 3 -o options )
# Exit with error if any of the above failed
exit ( $exit_1 && $exit_2 && $exit_3 )
私が検討したいくつかのこと:
エラー コードを変数に 1 行で取得する:
exit_1=$( test1 ./src/ --test-1=option )$?
exit_2=$( test2 ./src/ test-2-options )$?
exit_3=$( test3 ./src/ -t 3 -o options )$?
これは機能し、これを少し短くしますが、他の人がこれを使用するのを見たことがありません. これは賢明で正気ですか?これに問題はありますか?
テストを実行するだけで、 && それらを一緒に:
test1 ./src/ --test-1=option && \
test2 ./src/ test-2-options && \
test3 ./src/ -t 3 -o options
status=$?
これは、bash の短絡として機能しません。失敗した場合test1
、test2 と test3 は実行されないので、すべて実行する必要があります。
エラーを検出して終了する|| exit
[[ $exit_1 -eq 0 && $exit_2 -eq 0 && $exit_3 -eq 0 ]] || exit 1
これにより、ぎこちない終了コードと変数を 1 行節約できますが、重要な部分exit 1
が行末にあり、見落とす可能性があります。理想的には、次のようなものが機能します。
exit [[ $exit_1 -eq 0 && $exit_2 -eq 0 && $exit_3 -eq 0 ]]
もちろん、エコーする代わりに出力を返すため、これは機能しません。[[
exit $( [[ $exit_1 -eq 0 && $exit_2 -eq 0 && $exit_3 -eq 0 ]] ; echo $? )
動作しますが、それでも恐ろしいクラッジのようです
exit-code-as-boolean を明示的に処理しない
[[ $exit_1 && $exit_2 && $exit_3 ]]
これは、あなたが望んでいることをしません。&& 変数に格納された 3 つのリターン コードを組み合わせる最も簡単な方法は、完全な$var -eq 0 && ...
. 確かにもっと良い方法はありますか?
私はbashが良いプログラミング言語ではないことを知っています-あなたがそれをそれと呼ぶことができるなら-しかし、これを少しでも簡単にする方法はありますか?