Bash 导出忽略 set -ex

Bash 导出忽略 set -ex

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

#!/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不存在,这也不会停止。但如果没有导出,它就会失败。为什么?

答案1

在:

a=$(cmd)

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

a=$(cmd) export a

或者

export a="$(cmd)"

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

在这里你想要:

a=$(cmd)
export a

或者更好的是,摆脱不可靠的情况set -e并手动进行适当的错误处理:

a=$(cmd) || exit
export a

参见例如BashFAQ 015:“为什么 set -e 没有达到我的预期?”了解为什么以及如何set -e产生意想不到的结果的更多示例。

相关内容