检查Bash脚本是否与sh兼容

7

我有一个脚本,其中定义了#!/bin/bash,我想检查这个脚本是否与#!/bin/sh兼容。

有没有办法做到这一点?


1
你可以尝试使用 http://www.shellcheck.net/。然而,即使你检查过该网站,也不能保证它能正常工作。基本上,你需要手动审核每一行代码,因为当一个表达式在语法上是正确的时候,并不意味着它仍然会按照你的预期运行。 - hek2mgl
4
阅读Bashisms是一个不错的开始。 - John B
相关:sh和bash之间的区别 - dimo414
2个回答

7
"作为一个目标,与sh兼容并不是必须的。您遇到了什么问题需要您的脚本与sh一起工作?根据您的理由,不同的选项可能足够或不足够。如果您只需要在大多数现代环境中运行脚本,则使用bash应该完全可以,并且实际上可能比使用sh更好,因为sh在不同平台上映射到不同的shell。在大多数现代环境中,它实际上并不是自己的二进制文件,而只是符合POSIX标准的模式下的bash或另一个shell,如dash

如果您真的只需要让现有的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 兼容。

请注意,您可以编写一个sh兼容的脚本,但仍不符合POSIX标准,因为许多标准实用程序(如grep)具有自己的符合POSIX标准的功能集,您也需要尊重这些功能。然而,符合POSIX标准本身并不是最终目的,我鼓励您在尝试符合标准之前确认自己确实需要支持POSIX。
我还问了一个相关问题,您可能会发现其中的信息有用。

@hek2mgl 是的,正如我所提到的,在Ubuntu上是使用dash。我的观点在于(1.)试图符合sh标准通常并不那么重要。还有什么是“明显错误/无用”的呢? - dimo414
/bin/bash在POSIX模式下可以用作/bin/sh,但这并不意味着它能运行为bash编写的任何脚本。 - hek2mgl
@hek2mgl,我不相信我在任何地方说过那样的话 - 实际上,我说了相反的话:“许多简单的 Bash 脚本是有效的 sh 脚本”。这意味着存在一些 Bash 脚本,特别是非平凡的脚本,它们不是有效的 sh 脚本。 - dimo414
在讨论偏离主题之前,我想说的是,“使一个shell脚本符合POSIX标准”的任务并不是一件简单的事情,也没有通用的解决方案。首先,你需要确保在shell语法本身中不使用“bashisms”,然后你还需要确保任何程序(如grep、sed、awk等)都以符合POSIX标准的方式被调用,这取决于脚本的复杂程度,可能会非常痛苦。 - hek2mgl
@hek2mgl 随意发布您自己的答案。据我所知,我试图传达与您相同的事情(理想情况下,不要尝试成为“sh”兼容)。请注意,OP并非(直接)要求符合POSIX标准,而是要求sh兼容性。尽管它们有联系,但它们是不同的目标。 - dimo414
很遗憾,我没有答案 :) 如果您可以控制脚本运行的环境:请确保它们运行bash(和相关工具)。如果不行,可能需要使用其他东西,比如Python。如果还不行,在严格的POSIX环境中开发脚本可能是一个更好的开始。 - hek2mgl

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接