Jam*_*oon 4 bash bash-expansion
tl;dr我希望 bash 在declare var=$(false).
我的 bash 脚本使用set -e(或set errexit)。但是,当使用declare变量声明习惯用法时,declare似乎“阻止”从 shell 替换返回返回码。
$ var=$(false)
$ echo $?
1
$ declare var=$(false)
$ echo $?
0
Run Code Online (Sandbox Code Playgroud)
因此,bash 不会因为错误而退出。我知道我可以测试,var但是在每次declare声明之后都太麻烦了。
期间失败后如何自动退出bash declare?
编辑:为了澄清,我正在寻找一个答案,1)适用于可能的局部范围变量,2)适用于可能的只读变量,3)只需要一个语句。
使用您拥有的代码set -e将无法按预期工作。errexit触发命令的原因必须返回非零退出代码,但使用
declare var=$(false)
Run Code Online (Sandbox Code Playgroud)
尽管赋值false和结果$(..)导致非零退出代码,但使用会declare混淆此错误代码,并且由于该命令本身在为变量赋值时没有任何问题var,因此delcare内置程序将退出代码设置为0导致您的错误陷阱不触发。
解决问题的一种方法是将declare初始化和值分配分开
#!/usr/bin/env bash
set -e
declare var
var=$(false)
Run Code Online (Sandbox Code Playgroud)
不仅declare其他内置插件一样export,并local像上述情况下使用时,也掩盖了退出代码。看一个local在函数中使用的案例
set -e
f() { local var=$(false); }
f
Run Code Online (Sandbox Code Playgroud)
与上述 的情况一样declare,这里在函数中local隐藏了从 设置的退出代码$(..)。您需要将初始化和分配分开var以使其工作。
BashFAQ/105 - 为什么 set -e(或 set -o errexit,或 trap ERR)不符合我的预期?详细解释了使用的陷阱set -e以及推荐的错误处理机制。