[英]bash execute whole script but return exit code > 0 if any intermediate job has failed
我有一个 bash 脚本script.sh
,如下所示:
./step1.sh
./step2.sh
./step3.sh
无论是否失败,每个 step*.h 脚本都会返回正确的错误代码。
现在,如果 step3.sh 失败,我会得到一个适当的退出代码,但是如果 step1.sh 或 step2.sh 失败并且 step3.sh 成功,我会得到 status = 0,这并不理想。
我知道我可以使用
set -e
如果任何中间步骤失败,在我的脚本顶部使脚本失败,但这不是我想要的。
我想知道是否有一个简单的选项可以用来执行每个中间脚本(即使其中一个失败),但如果其中任何一个失败,则返回退出代码 > 0,而不必跟踪每个单独的退出代码手动。
您可以捕获错误:
#!/bin/bash
echo "test start."
trap 'rc=$?' ERR
./error.sh
./script2.sh
echo "test done."
return ${rc}
有关陷阱如何工作的更多信息,请参阅陷阱。
你可以这样做:
#!/bin/bash
# array with all the scripts to be executed
arr=(./step1.sh ./step2.sh ./step3.sh)
# initialize return status to 0
ret=0
# run a loop to execute each script
for i in "${arr[@]}"; do
echo "running $i"
bash "$i"
ret=$((ret | $?)) # return status from previous step bitwise OR with current status
done
echo "exiting with status: $ret"
exit $ret
我知道你说过你不想维护每个退出代码,但实际上用数组很容易做到:
declare -a rcs
./step1.sh ; rcs+=($?)
./step2.sh ; rcs+=($?)
./step3.sh ; rcs+=($?)
然后,您可以简单地循环遍历数组,根据需要查找第一个(或最大、最后一个、平均值、总和等)错误代码。 下面的代码显示了如何执行此操作以返回遇到的第一个错误:
for ((idx = 0; idx < ${#rcs[@]}; idx++)); do
[[ ${rcs[$idx]} -ne 0 ]] && return ${rcs[$idx]}
done
return 0
同样,要获得最大的误差:
rc=0
for ((idx = 0; idx < ${#rcs[@]}; idx++)); do
[[ ${rcs[$idx]} -gt $rc ]] && rc=${rcs[$idx]}
done
return $rc
归结为绝对的基础,
rc=0
./step1 || rc=$?
./step2 || rc=$?
./step3 || rc=$?
exit $rc
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.