我有一个像这样的 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
这会设置一个错误陷阱,每当命令以非零退出状态退出时,都会以与上述相同的方式设置错误陷阱。陷阱将在与errexit
shell 选项 ( set -e
) 终止脚本相同的情况下执行。为简单起见,您可以根据err=1
需要设置陷阱。
要在一段代码后取消陷阱,请使用
trap - ERR