无法找出合适的标题,我不理解破折号/重击的行为。也就是说,如果命令失败,我将使用set -e来纾困,并使用命令组来处理肯定的结果。
即。总体方案是:
[ ! wantcommand ] || command
比意味着仅在需要时才执行命令,并且失败将自动终止脚本。
可能需要一些后处理,在这种情况下,我使用以下方法:
[ ! wantcommand ] || { command && postprocess; }
这导致了一些奇怪的bug搜寻,因为这 不会杀死shell, 而我也无法理解原因。我现在必须遍历一些shell代码,但想了解原因。
用于检测:
bash -c 'set -e; { false || false && echo "post" ; }; echo "ec $?"'
要么:
bash -c 'set -e; { set -e; false || false && echo "post" ; }; echo "ec $?"'
注意:我不是在要求修复,而是主要 为什么返回码为1,但shell不会退出
set -e仅对 未检查的 故障保驾护航。
set -e
当您在故障分支(使用if,until,while,&&或||),即故障检查。
if
until
while
&&
||
如果规范不是以这种方式编写的,则短路布尔运算将无法有效地用于流控制,因为错误的分支总是会导致退出。
引用规范,并强调:
启用此选项后,如果任何命令失败(由于Shell错误的后果中列出的任何原因或通过返回大于零的退出状态),则Shell应立即退出,就像通过执行exit特殊内置实用程序一样不带参数,但以下情况除外: 多命令管道中任何单个命令的失败都不会导致外壳退出。仅考虑管道本身的故障。 该-e设置应执行以下化合物列表时被忽略while,until,if,或elif保留字,管道期初!保留字,或 比上其他的与一或列表的任何命令 。 如果除subshell命令以外的复合命令的退出状态-e是被忽略时失败的结果,则-e不适用于该命令。 此要求分别适用于外壳环境和每个子外壳环境。例如,在: set -e; (false; echo one) | cat; echo two 该false命令使子shell退出而不执行echo one; 但是,echo two由于管道的退出状态(false; echo one) | cat为零,因此执行。
启用此选项后,如果任何命令失败(由于Shell错误的后果中列出的任何原因或通过返回大于零的退出状态),则Shell应立即退出,就像通过执行exit特殊内置实用程序一样不带参数,但以下情况除外:
多命令管道中任何单个命令的失败都不会导致外壳退出。仅考虑管道本身的故障。
该-e设置应执行以下化合物列表时被忽略while,until,if,或elif保留字,管道期初!保留字,或 比上其他的与一或列表的任何命令 。
elif
!
如果除subshell命令以外的复合命令的退出状态-e是被忽略时失败的结果,则-e不适用于该命令。
-e
此要求分别适用于外壳环境和每个子外壳环境。例如,在:
set -e; (false; echo one) | cat; echo two
该false命令使子shell退出而不执行echo one; 但是,echo two由于管道的退出状态(false; echo one) | cat为零,因此执行。
false
echo one
echo two
(false; echo one) | cat
请注意,此规范已随时间而改变;实现POSIX规范的先前版本的shell可能与此处引用的版本不完全一致。
在这里提出一些意见- 我强烈建议您阅读BashFAQ#105,并确保您在决定使用之前完全理解其中描述的所有行为,set -e而不是手动实施显式的错误处理。所述FVUE维基进一步描述之间的行为的区别set -e在bash本地模式和POSIX模式,它同样应理解的。