微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么不设置-e导致`false ||失败 假&&真'?

无法弄清楚一个合适的标题,我不明白在短跑/ bash的行为。 也就是说,如果一个命令失败,我使用set -e来救助,命令组来处理积极的结果。

即。 总体scheme是:

[ ! wantcommand ] || command

比意味着命令只有在需要的时候才会被执行,而失败则会自动终止脚本。

有可能需要一些后处理,在这种情况下,我使用这个:

Bash读/写文件描述符 – 寻找文件的开始

将最后n行复制到新文件,然后从原始文件删除n行

一个Linux守护进程和STDIN / STDOUT

如何解决bash编码问题?

我如何find在所有子目录中具有相同名称的所有文件

[ ! wantcommand ] || { command && postprocess; }

这导致了一些好奇的布格,因为这不会杀死壳 ,我不能背后的理由。 我现在必须经过一些shell代码,但是想了解原因。

供testing用:

bash -c 'set -e; { false || false && echo "post" ; }; echo "ec $?"'

要么:

bash -c 'set -e; { set -e; false || false && echo "post" ; }; echo "ec $?"'

注意:我不是要求修复,但为什么returncode是1,但shell不会退出

理解脚本和程序之间的区别

PHP的preg_replace在bash中,具体的情况

Unix / Linux,从行中删除注释

bash删除较旧的文件

在索引X处更改stringchar

set -e只保留未经检查的失败。

在分支失败时(使用if , until , while , &&或|| ),检查失败。

如果规范不是这样写的,那么短路布尔运算就不能有效地用于流量控制,因为假分支总是会导致退出

从规范引用,重点补充说:

当这个选项打开的时候,当任何命令失败时(由于Shell Errors的后果中列出的任何原因,或者通过返回一个大于零的退出状态),shell立即退出,就好像通过执行退出特殊的内置实用程序没有任何争论,但有以下例外:

多命令管道中任何单个命令的失败都不会导致shell退出。 只有管​​道本身的失效才会被考虑。

执行后面的复合列表时,-e设置应该被忽略, until , if或者elif保留字, 保留字,或除最后一个以外的AND-OR列表的任何命令

如果sub-shell命令以外的复合命令的退出状态是-e被忽略的失败的结果,则-e不适用于此命令。

这个要求分别适用于shell环境和每个子shell环境。 例如,在:

set -e; (false; echo one) | cat; echo two

false命令会导致子shell不执行echo one而退出; 但是,由于管道的退出状态(false; echo one) | cat ,所以执行echo two (false; echo one) | cat是零。

请注意,这个规范已经改变了。 执行POSIX规范之前版本的shell可能并不完全符合此处引用的版本。

在这里注入一些意见 – 我强烈建议阅读BashFAQ#105,并确保在做出使用set -e的决定之前完全理解其中描述的所有行为,而不是手工实现明确的错误处理。 FVUE wiki进一步描述了在bash-native模式和POSIX模式下set -e之间的行为区别,这同样应该被理解。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐