Bash:“屏蔽返回值”是什么意思?

jus*_*ing 12 bash shell-script shellcheck

shellcheck 产生了以下警告

SC2155: Declare and assign separately to avoid masking return
values
Run Code Online (Sandbox Code Playgroud)

对于这行代码

local key_value=$(echo "$current_line" | mawk '/.+=.+/ {print $1 }')
Run Code Online (Sandbox Code Playgroud)

“屏蔽返回值”是什么意思,它与上述警告有什么关系?

jes*_*e_b 13

当您将变量声明为localor 或exported 时,它本身就是一个将返回成功与否的命令。

$ var=$(false)
$ echo $?
1
$ export var=$(false)
$ echo $?
0
Run Code Online (Sandbox Code Playgroud)

因此,如果您想对命令 ( echo "$current_line" | mawk '/.+=.+/ {print $1 }')的返回值进行操作,您将无法这样做,因为只要本地声明成功,它就会以 0 退出(这几乎总是会)。

为了避免这种情况,它建议单独声明然后分配:

local key_value
key_value=$(echo "$current_line" | mawk '/.+=.+/ {print $1 }')
Run Code Online (Sandbox Code Playgroud)

这是一个我经常忽略的 shellcheck 规则,只要您知道自己不尝试对该变量声明的返回值进行操作,IMO 就可以安全地忽略它。

您可以通过将以下内容添加到脚本顶部(当然在 hashbang 下方)来忽略它:

# shellcheck disable=SC2155
Run Code Online (Sandbox Code Playgroud)

  • 确定他们的代码是否*“试图对返回值采取行动”* 的人们应该记住,使用`set -e` 或 ERR 陷阱火灾也是一种操作(尽管 [无论如何我不建议使用它们]( http://mywiki.wooledge.org/BashFAQ/105#Exercises))。 (2认同)