无法弄清楚合适的标题,我不明白dash/bash中的行为.即,如果命令失败,我使用set -e来挽救,并且命令组处理肯定结果.
即.一般方案是:
[ ! wantcommand ] || command
Run Code Online (Sandbox Code Playgroud)
比意味着命令仅在需要时才被执行,并且失败将自动终止脚本.
可能需要一些后处理,在这种情况下我使用它:
[ ! wantcommand ] || { command && postprocess; }
Run Code Online (Sandbox Code Playgroud)
这导致了一些好奇的bughunting,因为这不会杀死壳,我无法得到原因.我现在必须经历一些shell代码,但是想了解原因.
用于检测:
bash -c 'set -e; { false || false && echo "post" ; }; echo "ec $?"'
Run Code Online (Sandbox Code Playgroud)
要么:
bash -c 'set -e; { set -e; false || false && echo "post" ; }; echo "ec $?"'
Run Code Online (Sandbox Code Playgroud)
注意:我不是要求修复,但主要原因是返回码为1,但shell不会退出
Cha*_*ffy 11
set -e只对未经检查的失败保释.
当您在故障分支(使用if,until,while,&&或||),即故障检查.
如果规范不是以这种方式编写的,则短路布尔操作不能有效地用于流控制,因为错误的分支总是会导致退出.
引用规范,重点补充:
当此选项打开时,当任何命令失败时(由于Shell错误的后果中列出的任何原因或通过返回大于零的退出状态),shell将立即退出,就好像通过执行exit特殊内置实用程序一样没有参数,但有以下例外:
多命令管道中任何单个命令的失败都不会导致shell退出.只考虑管道本身的故障.
该-e设置应执行以下的化合物列表时被忽略
while,until,if,或elif保留字,管道期初!保留字,或比上其他的与一或列表的任何命令.如果除了subshell命令之外的复合命令的退出状态是在
-e被忽略时失败的结果,-e则不应用于此命令.此要求分别适用于shell环境和每个子shell环境.例如,在:
Run Code Online (Sandbox Code Playgroud)set -e; (false; echo one) | cat; echo two该
false命令导致子shell退出而不执行echo one; 但是,echo two执行是因为管道的退出状态(false; echo one) | cat为零.
请注意,此规范随时间而变化; 实现POSIX规范的先前版本的shell可能不完全符合此处引用的版本.
在这里注入一些意见 - 我强烈建议阅读BashFAQ#105并确保在决定使用之前完全理解其中描述的所有行为,set -e而不是手动实现明确的错误处理.所述FVUE维基进一步描述之间的行为的区别set -e在bash本地模式和POSIX模式,它同样应理解的.