检查 Bash 脚本是否与 sh 兼容

Check if Bash script is compatible with sh

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

有办法吗?

运行带-n选项的脚本会解析读取命令,报语法错误,但不会执行代码。

sh -n <scriptname>

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

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

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

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

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

我问了一个 你可能也会觉得有帮助。