无法找出合适的标题,我不明白 dash/bash 中的行为。也就是说,我使用 set -e 在命令失败时进行救援,并使用命令组来处理积极结果。
IE。总体方案是:
[ ! wantcommand ] || command
Than 意味着该命令仅在需要时执行,失败将自动终止脚本。
可能需要一些后处理,在这种情况下我使用这个:
[ ! wantcommand ] || { command && postprocess; }
这导致了一些奇怪的错误搜寻,因为不会杀死外壳我无法理解背后的原因。我现在必须查看一些 shell 代码,但想了解原因。
供测试用:
bash -c 'set -e; { false || false && echo "post" ; }; echo "ec $?"'
or:
bash -c 'set -e; { set -e; false || false && echo "post" ; }; echo "ec $?"'
注意:我不是要求修复,而是要求修复为什么返回码是1,但是shell不会退出
set -e
只能保释未经检查的失败。
当你在失败时分支(使用if
, until
, while
, &&
or ||
),检查该故障。
如果规范不是以这种方式编写的,那么短路布尔运算就不能有效地用于流量控制,因为错误分支总是会导致退出。
引用自规格,并强调:
当此选项打开时,当任何命令失败时(由于中列出的任何原因)Shell 错误的后果或者通过返回大于零的退出状态),shell 应立即退出,就像执行不带参数的 exit 特殊内置实用程序一样,但以下情况除外:
-
多命令管道中任何单个命令的失败都不应导致 shell 退出。仅考虑管道本身的故障。
-
执行后面的化合物列表时,应忽略 -e 设置while
, until
, if
, or elif
保留字,以!
保留字,或AND-OR 列表中除最后一个命令之外的任何命令.
-
如果除子 shell 命令之外的复合命令的退出状态是失败的结果-e
被忽略,然后-e
不适用于该命令。
此要求分别适用于 shell 环境和每个子 shell 环境。例如,在:
set -e; (false; echo one) | cat; echo two
the false
命令导致子 shell 退出而不执行echo one
;然而,echo two
因为管道的退出状态而被执行(false; echo one) | cat
为零。
请注意,此规范随着时间的推移而发生变化;实现 POSIX 规范先前修订版的 shell 可能不完全符合此处引用的版本。
在这里发表一些意见——我强烈建议阅读Bash常见问题解答 #105并确保您在决定使用之前完全理解其中描述的所有行为set -e
而不是手动实现显式错误处理。这FVUE 维基进一步描述了之间的行为区别set -e
在 bash-native 模式和 POSIX 模式下,这同样应该被理解。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)