太长了;博士我希望 bash 之后自动退出declare var=$(false)
。
我的 bash 脚本使用set -e
(或set errexit
)。然而,当使用declare
变量声明习惯用法时,declare
似乎“阻止”从 shell 替换返回返回代码。
$ var=$(false)
$ echo $?
1
$ declare var=$(false)
$ echo $?
0
因此,bash不会因错误而退出。我知道我可以测试,var
但是每次声明后都太麻烦了declare
。
bash失败后如何自动退出declare
?
编辑:为了澄清,我正在寻找一个答案,1)适用于可能的本地范围变量,2)适用于可能的只读变量,3)只需要一个语句。
答案1
使用set -e
意志不是使用您拥有的代码按预期工作。原因是errexit
触发命令必须返回非零退出代码,但是
declare var=$(false)
尽管 的赋值false
和结果$(..)
会导致非零退出代码,但使用declare
会混淆此错误代码,并且由于该命令本身运行时没有任何问题,因此将值分配给变量var
,delcare
因此内置函数将退出代码设置为0
导致您的错误陷阱不触发。
解决该问题的一种方法是将declare
初始化和赋值分开
#!/usr/bin/env bash
set -e
declare var
var=$(false)
在上述情况下使用时,不仅declare
其他内置函数喜欢export
,而且local
还会模糊退出代码。查看local
在函数中使用的情况
set -e
f() { local var=$(false); }
f
与上面的情况一样declare
,函数中的此处local
隐藏了从 中设置的退出代码$(..)
。您需要将初始化和分配分开才能var
使其正常工作。
BashFAQ/105 - 为什么 set -e (或 set -o errexit 或 trap ERR)没有达到我的预期?详细解释了使用的陷阱set -e
以及推荐的错误处理机制。
答案2
您必须将赋值右侧的错误与所使用的命令分开。如果您想要声明命令的“一行解决方案”,您可以使用:
value=$(false); declare -r var="$value"
如果您不想使用新的变量,则可以使用内置的临时变量,例如$REPLY
(由 read 使用)或$_
(上一个命令行的最后一个参数)。
使用$REPLY
可能很简单:
REPLY=$(false); declare -r var="$REPLY"
使用$_
可能会变得复杂或令人费解。
对我来说:事实set -e
证明,使用更多的是一个问题而不是一个解决方案。躲开它。