如果声明语句失败则让 bash 退出

如果声明语句失败则让 bash 退出

太长了;博士我希望 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会混淆此错误代码,并且由于该命令本身运行时没有任何问题,因此将值分配给变量vardelcare因此内置函数将退出代码设置为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证明,使用更多的是一个问题而不是一个解决方案。躲开它。

相关内容