1

当您使用 local 时,Bashate linter 会引发错误,但它没有说明如何重写代码以使其通过 linting。

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

来自https://github.com/openstack/kolla-ansible/blob/master/tools/kolla-ansible#L6的示例

function find_base_dir {
    local real_path=$(python -c "import os;print(os.path.realpath('$0'))")
    local dir_name="$(dirname "$real_path")"
    ...
}
4

1 回答 1

1

显然,在这种情况下,只需将bashate变量声明与子shell捕获分开即可:

function func {
    local var
    var="$(...)"
    ...
}

通过这种方式,您可以检查子外壳中可能发生的错误:

var="$(...)"
status=$?

最初我认为bashate可能是因为$?未处理状态变量而抱怨,或者可能存在一种我不知道的捕获子shell输出的方法。不是,我也不是。然而,一些相关点:

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

output=$(inner) || exit $?

请参阅@grawity 的此答案以获取类似的表格。

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

f() { local    v=$(echo data; false); echo output:$v, status:$?; }
g() { local v; v=$(echo data; false); echo output:$v, status:$?; }
$ f     # fooled by 'local' with inline initialization
output:data, status:0
$ g     # a good one
output:data, status:1

有关更多信息,请参阅@ryenus 的答案

最后,这个答案在线程中详细说明了可移植性和风格规定方面的一些缺陷bashate,这强化了风格指南只是工具的概念,可能是也可能不是适合这项工作的工具。

于 2019-12-11T02:02:58.153 回答