【问题标题】:Check if Bash script is compatible with sh检查 Bash 脚本是否与 sh 兼容
【发布时间】:2015-10-14 21:58:09
【问题描述】:

我有一个定义为#!/bin/bash 的脚本,我想检查此脚本是否与#!/bin/sh 兼容。

有办法吗?

【问题讨论】:

  • 你可以试试:shellcheck.net。但是,即使您检查了该站点,也不能保证它可以正常工作。基本上你需要手动检查每一行,因为当一个表达式在语法上是正确的,这并不意味着它仍然需要你想要的。
  • 阅读Bashisms 将是一个不错的起点。

标签: bash shell scripting sh


【解决方案1】:

成为sh-兼容本身并不是一个目标。您遇到什么问题需要您的脚本与sh 一起工作?根据您的推理,不同的选项可能足够,也可能不够。如果您只是需要您的脚本在大多数现代环境中运行,那么使用bash 应该非常好,并且实际上可能比使用sh 更好,因为sh 映射到不同平台上的不同shell。在大多数现代环境中,它实际上并不是它自己的二进制文件,而只是POSIX-compliant mode 中的bash,或者像dash 这样的另一个shell。

如果您真的只需要使现有的 Bash 脚本与 shebang #!/bin/sh 一起工作,您有多种选择:

  1. 只需以 sh your_script.sh 运行它,看看会发生什么 - Bash 是 sh 语法的超集,因此许多简单的 Bash 脚本都是有效的 sh 脚本。
  2. 按照 rojomoke 的建议运行 sh -n your_script.sh,它会在不实际执行脚本的情况下报告语法错误(但可能无法捕获所有问题)。
  3. 手动审核您的脚本是否存在无效语法(John B 的Bashisms 参考并不是一个糟糕的开始),这显然不是一个很好的解决方案,但在实践中这是唯一可以确定的方法。如果这看起来令人生畏,那么,它是:)

如果你想要/需要支持sh,最好的选择就是简单地将你的脚本的shebang指定为#!/bin/sh - 如果它在你需要的环境中表现得如你所愿,那么它(根据定义)sh-兼容。

请注意,您可以编写仍不符合 POSIX 标准的 sh 兼容脚本,因为像 grep 这样的许多标准实用程序都有自己的符合 POSIX 标准的功能集,您也需要遵守。同样,符合 POSIX 本身并不是目的,我鼓励您在尝试符合标准之前确认您确实需要支持 POSIX。

我问了related question,你可能也会觉得有帮助。

【讨论】:

  • @hek2mgl 是的,如前所述,它在 Ubuntu 上是 dash。我在 (1.) 中的观点是,试图成为 sh 兼容(通常)并不那么重要。还有什么是“完全错误/无用”?
  • POSIX 模式下的 /bin/bash 可能用于 /bin/sh 的事实并不意味着它将运行为 bash 编写的任何脚本。
  • @hek2mgl 我不相信我在任何地方都说过——事实上我说的是相反的:“许多简单的 Bash 脚本是有效的sh 脚本”。这意味着存在 Bash 脚本,尤其是非平凡的,它们不是有效的 sh 脚本。
  • 在讨论进入错误的方向之前,我想说的是“使shell脚本POSIX兼容”的任务并非易事,没有通用的解决方案。虽然您首先要确保不会在 shell 语法本身中使用 bashisms,但您将进一步确保任何程序,如 grepsedawk 等. etc. 会以正确的方式被调用,这可能会带来无尽的痛苦,具体取决于脚本。
  • @hek2mgl 随时发布您自己的答案。尽我所能告诉我我正在尝试传达与您相同的东西(理想情况下,不要试图成为sh-compatible)。请注意,尽管 OP 不是(直接)要求 POSIX 合规性,只是 sh 兼容性。当然,它们是相互关联的,但它们是不同的目标。
【解决方案2】:

使用-n 选项运行脚本将解析和读取命令,并报告语法错误,但不会执行代码。

sh -n <scriptname>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-11
    • 2021-07-26
    • 2015-04-04
    • 2017-01-05
    • 1970-01-01
    • 2019-12-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多