我今天遇到了一些奇怪的行为:
#!/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
产生意想不到的结果的更多示例。