我今天遇到了一些奇怪的行为:
#!/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
不存在。但如果没有出口,它就会失败。为什么?
发布于 2018-02-27 06:04:22
在:
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:“为什么-e不按我的预期来做呢?”可以产生意外结果的更多示例,请参见set -e
。
https://unix.stackexchange.com/questions/426943
复制相似问题