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

And*_*ykh 2 bash exit-status

我有一个像这样的 bash 脚本

#!/bin/bash

do-this parm someotherparam
do-something-else $varz $(commands)
and-also-do-this -something
finally-do-something-different -yes
Run Code Online (Sandbox Code Playgroud)

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

显然,如果我们在每行之后检查状态,我们可以很容易地实现我们的目标,即使只是冗长。由于我是 bash 新手,我想知道是否有一种惯用的方式来写这个。

注:我想不管他们的退出状态的所有命令运行,否则像这样将工作

Kus*_*nda 5

#!/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 |= $? ))
Run Code Online (Sandbox Code Playgroud)

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

exit "$err"如果你愿意,你可以在脚本的末尾。

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

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

# (rest of original script)
Run Code Online (Sandbox Code Playgroud)

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

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

trap - ERR
Run Code Online (Sandbox Code Playgroud)