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

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)只需要一个语句。

Ini*_*ian 6

使用您拥有的代码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以及推荐的错误处理机制。