检查 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
一起工作,您有多种选择:
- 只是 运行 和
sh your_script.sh
一样,看看会发生什么 - Bash 是 sh
语法的超集,所以很多简单的 Bash 脚本都是有效的sh
个脚本。
- 运行
sh -n your_script.sh
正如 rojomoke 所建议的那样,它会在不实际执行脚本的情况下报告语法错误(但可能无法捕获所有问题)。
- 手动检查您的脚本是否存在无效语法(John B 的 Bashisms 参考是一个不错的开始),这显然不是一个很好的解决方案,但在实践中这是唯一可以确定的方法。如果这看起来令人生畏,那么,那就是 :)
如果您 want/need 支持 sh
最好的选择就是将您的脚本的 shebang 指定为 #!/bin/sh
- 如果它在您需要的环境中表现得如您所愿,那么它就是(根据定义)sh
兼容。
请注意,您可以编写一个 sh
兼容的脚本,但它仍然不是 POSIX-compliant,因为像 grep
这样的许多标准实用程序都有自己的 POSIX-compliant 功能集你也需要尊重。不过,成为 POSIX-compliant 本身并不是目的,我鼓励您在尝试符合标准之前确认您确实需要支持 POSIX。
我问了一个 你可能也会觉得有帮助。
我有一个定义了 #!/bin/bash
的脚本,我想检查这个脚本是否与 #!/bin/sh
兼容。
有办法吗?
运行带-n
选项的脚本会解析读取命令,报语法错误,但不会执行代码。
sh -n <scriptname>
sh
兼容本身并不是目标。您 运行 遇到什么问题需要您的脚本与 sh
一起工作?根据您的推理,不同的选项可能足够也可能不够。如果你只需要你的脚本在大多数现代环境中 运行 那么使用 bash
应该是完美的,并且实际上可能比使用 sh
更好,因为 sh
映射到不同的shells 在不同的平台上。在大多数现代环境中,它实际上并不是它自己的二进制文件,而只是 POSIX-compliant mode 中的 bash
,或者另一个 shell,例如 dash
.
如果您真的只需要使现有的 Bash 脚本与 shebang #!/bin/sh
一起工作,您有多种选择:
- 只是 运行 和
sh your_script.sh
一样,看看会发生什么 - Bash 是sh
语法的超集,所以很多简单的 Bash 脚本都是有效的sh
个脚本。 - 运行
sh -n your_script.sh
正如 rojomoke 所建议的那样,它会在不实际执行脚本的情况下报告语法错误(但可能无法捕获所有问题)。 - 手动检查您的脚本是否存在无效语法(John B 的 Bashisms 参考是一个不错的开始),这显然不是一个很好的解决方案,但在实践中这是唯一可以确定的方法。如果这看起来令人生畏,那么,那就是 :)
如果您 want/need 支持 sh
最好的选择就是将您的脚本的 shebang 指定为 #!/bin/sh
- 如果它在您需要的环境中表现得如您所愿,那么它就是(根据定义)sh
兼容。
请注意,您可以编写一个 sh
兼容的脚本,但它仍然不是 POSIX-compliant,因为像 grep
这样的许多标准实用程序都有自己的 POSIX-compliant 功能集你也需要尊重。不过,成为 POSIX-compliant 本身并不是目的,我鼓励您在尝试符合标准之前确认您确实需要支持 POSIX。
我问了一个