聚合脚本中子脚本的状态代码

聚合脚本中子脚本的状态代码

我有一个像这样的 bash 脚本

#!/bin/bash

do-this parm someotherparam
do-something-else $varz $(commands)
and-also-do-this -something
finally-do-something-different -yes

如果上面的所有单个命令都返回 0,我希望此脚本返回退出状态 0。如果任何单个命令返回非零,我希望它返回非零。我不在乎非零值是什么,只要它不是 0 即可。

显然,如果我们在每一行之后检查状态,即使很冗长,我们也可以轻松实现我们的目标。由于我是 bash 的新手,我想知道是否有一种惯用的写法。

注意:我希望所有命令都运行,无论其退出状态如何,否则类似会工作

答案1

#!/bin/bash

err=0

do-this parm someotherparam             ; (( err |= $? ))
do-something-else $varz $(commands)     ; (( err |= $? ))
and-also-do-this -something             ; (( err |= $? ))
finally-do-something-different -yes     ; (( err |= $? ))

这会将变量初始化err为零,然后在每个命令之后设置err$err | $?(按位或)。err如果任何命令以非零退出状态退出,则该值将设置为非零数字,并且到脚本结束时它将保持非零值。

如果您愿意,可以exit "$err"在脚本的结尾处。

获得相同结果的较少手动方法:

err=0
trap '(( err |= $? ))' ERR

# (rest of original script)

err这会设置一个错误陷阱,每当命令以非零退出状态退出时,都会以与上述相同的方式设置错误陷阱。陷阱将在与errexitshell 选项 ( set -e) 终止脚本相同的情况下执行。为简单起见,您可以根据err=1需要设置陷阱。

要在一段代码后取消陷阱,请使用

trap - ERR

相关内容