我正在使用 bash 编写脚本。
当一行导致错误时,我使用 set -e
以使脚本退出(错误)(我喜欢这种方法,我发现不太容易出错)。我几乎总是将它与 set -u
结合起来,以便在尝试读取未定义的变量时也“引发”错误。
长期以来,它就像一种魅力。但是今天,我在我的脚本中发现了一个以前用“set -eu”无法捕捉到的错误,因为这似乎不会像往常一样引发错误。
对于以下内容,我将使用总是返回错误的 false
命令(在我的脚本中,这是另一个个人命令,但这使您更容易重现)。
set -eu
A=$(false)
上面的代码退出 bash 并出现错误。酷,这是我所期望的。
但 :
set -eu
export A=$(false)
不会引发任何错误, bash 完全可以!它甚至将变量 A 设置为空字符串,因此进一步读取 $A 也不会引发错误!
这对我来说真的很奇怪,有没有办法获得预期的行为,也许是 ```set` 的另一种选择?
我可以这样做是为了让它引发错误,但我每次都必须这样写,所以它对于捕捉错误的用处不大:
set -eu
A=$(false)
export A=$A
上帝 bash 很复杂:-)
回答1
您没有收到错误,因为 export
本身是成功的。我找不到该行为的明确文档,但是在构建另一个命令的参数时的命令替换似乎是非零退出状态不会触发 set -e
的特殊情况之一。