发布
社区首页 >问答首页 >Bash导出忽略set -ex

Bash导出忽略set -ex
EN

Unix & Linux用户
提问于 2018-02-27 13:58:58
回答 1查看 933关注 0票数 8

我今天遇到了一些奇怪的行为:

代码语言:javascript
代码运行次数:0
复制
#!/bin/bash
set -ex
export a=$(cat foo)
echo "It's a living thing"
b=$(cat foo)
echo "This won't make it"

这在cat foo上是不会停止的,即使foo不存在。但如果没有出口,它就会失败。为什么?

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2018-02-27 14:04:22

在:

代码语言:javascript
代码运行次数:0
复制
a=$(cmd)

这是一个没有命令部分的简单命令,所以退出状态是命令替换的状态。在:

代码语言:javascript
代码运行次数:0
复制
a=$(cmd) export a

代码语言:javascript
代码运行次数:0
复制
export a="$(cmd)"

这里有一个命令部分(即使在某些shell中,export在命令和关键字之间),所以返回它的退出状态。如果cmd失败并没有产生任何输出,export a=仍将运行并成功,因此export将返回0退出状态。

在这里你会想:

代码语言:javascript
代码运行次数:0
复制
a=$(cmd)
export a

或者更好的是,摆脱不可靠的set -e,手工进行正确的错误处理:

代码语言:javascript
代码运行次数:0
复制
a=$(cmd) || exit
export a

有关为什么和如何BashFAQ 015:“为什么-e不按我的预期来做呢?”可以产生意外结果的更多示例,请参见set -e

票数 16
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/426943

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档