【问题标题】:Is there a static analysis tool like Lint or Perl::Critic for shell scripts?是否有像 Lint 或 Perl::Critic 这样的静态分析工具用于 shell 脚本?
【发布时间】:2011-04-09 18:43:19
【问题描述】:

是否有任何 shell(特别是 bash 或 ksh)检查器可以测试 shell 脚本的样式、最佳实践、命名约定等? (类似于 C 的 Lint 或 Perl 的 Perl::Critic。)

我知道使用 ksh 您可以通过运行 ksh -n script.ksh 进行语法检查,但我希望的不仅仅是语法检查 - 解析/分析实际代码的东西?

我可能不走运,但我想问一下也无妨。

【问题讨论】:

    标签: shell static-analysis checkstyle


    【解决方案1】:

    Debian 和 Ubuntu 项目使用脚本 checkbashisms,它查找可能表明有人依赖 /bin/shbash 的特定模式。

    除此之外,大多数 shell 都有一个 -n 选项来解析和报告错误。你可以对照几个不同的 shell 检查你的脚本,以确保它只使用可移植的语法:

    for shell in zsh ksh bash dash sh
    do
      echo "Testing ${shell}"
      ${shell} -n my_script.sh
    done
    

    编辑添加:自从写了这个答案,shellcheck 已经写了,正如in a later answer 所建议的那样。与之前的建议相比,这在 linting shell 脚本方面做得更彻底。

    【讨论】:

    • 酷 - 这个脚本看起来很有希望!从我没有找到其他任何东西以及没有回应来看,我想说这可能是唯一能做这种事情的东西。非常感谢!
    • 是我还是这个选项不在 bash 和 zsh 的手册页中?
    • 为什么 21 世纪的 bash 解释器不能给出更有用的信息,比如“第 23 行的 'if' 没有匹配的 'fi' ...”,而不是像这样令人沮丧的无用废话? $ bash -n /tmp/baa.sh /tmp/baa.sh: 第 56 行:语法错误:文件意外结束 $ zsh -n /tmp/baa.sh /tmp/baa.sh:56: ` 附近的解析错误\n'
    • @BrianCampbell 太棒了!我打算只为那个 sn-p 分叉一个 repo!
    • 这个脚本可以对多个 shell 的脚本执行基本语法检查很有帮助,但它确实没有回答 @BrianH 关于解析/分析的问题。
    【解决方案2】:

    I found shellcheck:它测试引用中的常见错误以及您忽略的其他内容(“因为它有效”)。

    【讨论】:

    • 这太糟糕了,它依赖于 Haskell。这很好,但是 haskell 是一个很大的依赖项。
    • @Shurane - 依赖项仅用于构建,而不是运行可执行文件。
    • 看来唯一的依赖是浏览器。
    • 我也发现了shellcheck,它是一个非常有用且简单的工具。
    • 很棒的提示;在 OSX 上,您现在还可以通过 Homebrewbrew install shellcheck 安装 shellcheck.net CLI,shellcheck
    【解决方案3】:

    我写了shlint 来包装 checkbashims 以及 Brian 的回答中提供的 shell 可用的其他基本 linting 选项。

    它可以通过 ruby​​gems (gem install shlint) 安装,实际上是一种噱头,但您只需要 perl(用于 checkbashims)和一个符合 POSIX 的 shell 来解释 shlint 命令本身。应该在 OSX 和 Ubuntu 上开箱即用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      • 2010-12-27
      • 1970-01-01
      • 2021-08-26
      相关资源
      最近更新 更多