どこかでコピーされた動作しているglobal_exitがあり、両方のコマンド出口に使用されます。失敗を強制するために、「echo」の名前を「ech」に変更すると、すべての置換が機能しているかどうかをテストできます。ここで行われます。
echo "$USER $(date +%F)" |& tee info.log
info_exit=${PIPESTATUS[0]}
echo "$USER $(date +%F)" |& tee list.log
list_exit=${PIPESTATUS[0]}
global_exit=$(( info_exit > list_exit ? info_exit : list_exit ))
if [ ${global_exit} = "0" ]; then
echo ">> SUCCESS <<"
elif [ ${global_exit} = "1" ]; then
echo ">> WARNINGS <<"
else
echo ">> FAILED <<"
fi
exit
これを3つのRCに拡張するにはどうすればよいですか?この機能の使用方法に関するルールが見つかりませんでした。私は次のように推測しましたが、同じテストのすべての順列に対しては機能しません(失敗を強制するには、1つのエコー名を1つずつechに変更します)。
echo "$USER $(date +%F)" |& tee info.log
info_exit=${PIPESTATUS[0]}
echo "$USER $(date +%F)" |& tee list.log
list_exit=${PIPESTATUS[0]}
echo "$USER $(date +%F)" |& tee check.log
check_exit=${PIPESTATUS[0]}
global_exit=$((( info_exit > list_exit > check_exit ? info_exit : list_exit > check_exit )))
if [ ${global_exit} = "0" ]; then
echo ">> SUCCESS <<"
elif [ ${global_exit} = "1" ]; then
echo ">> WARNINGS <<"
else
echo ">> FAILED <<"
fi
exit
ありがとうございます:)
答え1
私の意図が正確で、書いたコードを引き続き使用するには、次の変更を行います。
global_exit=$((( info_exit > list_exit > check_exit ? info_exit : list_exit > check_exit )))
これに関して:
global_exit=$((( info_exit > list_exit > check_exit ? info_exit : list_exit > check_exit ? list_exit : check_exit )))
info_exitが最大の場合はご存知のようにうまく動作します。それ以外の場合、global_exitはlist_exit> check_exitかどうかに応じて0または1に設定されます。追加の条件が追加されると、list_exit と check_exit のどちらか大きい方に設定されます。
答え2
0、1、およびその他すべての戻りコードを一緒にチェックする1つの方法は、戻りコードを結合することです。
echo "$USER $(date +%F)" |& tee info.log
exit_code=$((exit_code | PIPESTATUS[0]))
echo "$USER $(date +%F)" |& tee list.log
exit_code=$((exit_code | PIPESTATUS[0]))
echo "$USER $(date +%F)" |& tee check.log
exit_code=$((exit_code | PIPESTATUS[0]))
if (( 0 == exit_code )); then
echo ">> SUCCESS <<"
elif (( 1 == exit_code )); then
echo ">> WARNING <<"
else
echo ">> FAILED <<"
fi
このアプローチでは、終了コードを区別することはできず、複数の戻りコードが発生する可能性がありますが、通常のOK / Not OK戻りコードには十分です。
答え3
機能を使用して確認できますみんなステータスコードを選択PIPESTATUS
し、最も高い値を保存します。
#!/bin/bash
max_exit=0
set_max_exit() {
for i in "${PIPESTATUS[@]}"; do
[ "$i" -gt "$max_exit" ] && max_exit=$i
done
}
echo | grep x # exit 1
set_max_exit
ech # exit 127
set_max_exit
ls adfds # exit 2
set_max_exit
if [ "$max_exit" -eq 0 ]; then
echo ">> SUCCESS <<"
elif [ "$max_exit" -eq 1 ]; then
echo ">> WARNING <<" >&2
else
echo ">> FAILED <<" >&2
fi
exit "$max_exit"
出力:
$ ./script.sh
./script.sh: line 14: ech: command not found
ls: cannot access 'adfds': No such file or directory
>> FAILED <<
$ echo $?
127