Bash - 如果第一次失败,则执行两个命令并获得退出状态 1

Edu*_*rdo 5 bash exit-status

在下面的情况下,report必须始终执行命令,但如果test命令失败,我需要获得退出状态 1 :

test;report
echo $?
0
Run Code Online (Sandbox Code Playgroud)

如何在不创建 shell 脚本的情况下在单个 bash 行中执行此操作?

Gil*_*il' 18

保存和重复使用$?

test; ret=$?; report; exit $ret
Run Code Online (Sandbox Code Playgroud)

如果您有多个测试命令,并且想要全部运行它们,但要跟踪其中一个是否失败,您可以使用 bash 的 ERR 陷阱。

failures=0
trap 'failures=$((failures+1))' ERR
test1
test2
if ((failures == 0)); then
  echo "Success"
else
  echo "$failures failures"
  exit 1
fi
Run Code Online (Sandbox Code Playgroud)


Jef*_*ler 9

除了包含 shell 命令的文件之外,什么是 shell 脚本?你可以假装它不是一个 shell 脚本,然后把它放在一行上,比如:

(test; r=$?; report; [ "$r" -gt 0 ] && exit 1; exit 0)
Run Code Online (Sandbox Code Playgroud)

1如果第一个命令返回除0;以外的任何内容,这将退出子shell 否则,它返回0

例如——我只是在回应一些东西而不是运行一个真正的程序:

$ (false; r=$?; echo report; [ "$r" -gt 0 ] && exit 1; exit 0)
report
$ echo $?
1
$ (true; r=$?; echo report; [ "$r" -gt 0 ] && exit 1; exit 0)
report
$ echo $?
0
$ # example with an exit-status of 2:
$ (grep foo bar; r=$?; echo report; [ "$r" -gt 0 ] && exit 1; exit 0)
grep: bar: No such file or directory
report
$ echo $?
1
Run Code Online (Sandbox Code Playgroud)

如果您定期设置errexitshell 选项,您需要添加一个覆盖,以便子 shell 不会过早退出:

(set +o errexit; false; r=$?; echo report; [ "$r" -gt 0 ] && exit 1; exit 0)
Run Code Online (Sandbox Code Playgroud)