我有一个像这样的 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 新手,我想知道是否有一种惯用的方式来写这个。
注:我想不管他们的退出状态的所有命令运行,否则像这样将工作
#!/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)
| 归档时间: |
|
| 查看次数: |
734 次 |
| 最近记录: |