【问题标题】:How to I avoid E042 local declaration hides errors with bashate?如何避免 E042 本地声明隐藏 bashate 错误?
【发布时间】:2020-03-20 16:51:39
【问题描述】:

当您使用本地时,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")"
    ...
}

【问题讨论】:

    标签: bash bashate


    【解决方案1】:

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

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

    这样您可以检查子shell中可能发生的错误:

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

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

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

    output=$(inner) || exit $?
    

    请参阅@grawity 的this answer 了解类似的表格。

    $? 报告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 的this answer 了解更多信息。

    最后,this answer 在线程中详细说明了一些在可移植性和bashate 规定的风格方面的缺陷,这强化了这样一种观念,即风格指南只是工具,可能是也可能不是适合这项工作的工具.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-11
      • 1970-01-01
      相关资源
      最近更新 更多