在下面的情况下,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)
除了包含 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)
| 归档时间: |
|
| 查看次数: |
6742 次 |
| 最近记录: |