如何使用bashate避免E042本地声明隐藏错误?

如何使用bashate避免E042本地声明隐藏错误?,bash,bashate,Bash,Bashate,当您使用local时,Bashate linter会抛出一个错误,但它没有给出如何重写代码以使其通过linting的指示 显然,我可以禁用该检查,但这不是重点,目的是找到一种更好的方法来编写代码 来自 函数find\u base\u dir{ 本地实路径=$(python-c“导入操作系统;打印(os.path.realpath('$0'))) 本地dir_name=“$(dirname“$real_path”)” ... } 显然,在这种情况下,安抚bashate所需要的只是将变量声明与子sh

当您使用local时,Bashate linter会抛出一个错误,但它没有给出如何重写代码以使其通过linting的指示

显然,我可以禁用该检查,但这不是重点,目的是找到一种更好的方法来编写代码

来自

函数find\u base\u dir{
本地实路径=$(python-c“导入操作系统;打印(os.path.realpath('$0')))
本地dir_name=“$(dirname“$real_path”)”
...
}

显然,在这种情况下,安抚
bashate
所需要的只是将变量声明与子shell捕获分离:

function func {
    local var
    var="$(...)"
    ...
}
通过这种方式,您可以检查子shell中可能发生的错误:

var="$(...)"
status=$?
起初我认为
bashate
可能会抱怨,因为状态变量
$?
未被处理,或者可能存在一种捕获子shell输出的方法,而我并不知道。不是,我也不是。然而,一些相关的观点:

$?
可以在原子表达式中捕获:

output=$(inner) || exit $?
f() { local    v=$(echo data; false); echo output:$v, status:$?; }
g() { local v; v=$(echo data; false); echo output:$v, status:$?; }
类似形式见@grawity

$?
报告
本地
命令的状态,而不是子shell的退出状态(如果在复合表达式中使用):

output=$(inner) || exit $?
f() { local    v=$(echo data; false); echo output:$v, status:$?; }
g() { local v; v=$(echo data; false); echo output:$v, status:$?; }
更多信息请参见@ryenus

最后,在线程中的其他部分中,详细说明了可移植性方面的一些缺陷,以及样式
bashate
规定的一些缺陷,这些缺陷强化了这样一个概念,即样式指南只是一些工具,可能是也可能不是工作的正确工具