繁体   English   中英

bash 执行整个脚本,但如果任何中间作业失败,则返回退出代码 > 0

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM