检查Bash脚本是否与sh兼容

检查Bash脚本是否与sh兼容,bash,shell,scripting,sh,Bash,Shell,Scripting,Sh,我有一个脚本,其中定义了#/bin/bash,我想检查此脚本是否与兼容/bin/sh 有办法吗?使用-n选项运行脚本将解析和读取命令,并报告语法错误,但不会执行代码 sh -n <scriptname> sh-n 成为sh-兼容本身并不是一个目标。您遇到了哪些问题需要您的脚本使用sh?根据你的推理,不同的选择可能是足够的,也可能是不够的。如果您只需要在大多数现代环境中运行脚本,那么使用bash应该很好,而且实际上可能比使用sh更好,因为sh映射到不同平台上的不同shell。在大多数

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


有办法吗?

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

sh -n <scriptname>
sh-n

成为
sh
-兼容本身并不是一个目标。您遇到了哪些问题需要您的脚本使用
sh
?根据你的推理,不同的选择可能是足够的,也可能是不够的。如果您只需要在大多数现代环境中运行脚本,那么使用
bash
应该很好,而且实际上可能比使用
sh
更好,因为
sh
映射到不同平台上的不同shell。在大多数现代环境中,它实际上并不是自己的二进制文件,而是
bash
in或另一个类似于
dash
的shell

如果您真的只需要让现有的Bash脚本与shebang
#一起工作/bin/sh
您有几个选项:

  • 只需将它作为
    sh your_script.sh
    运行,看看会发生什么-Bash是
    sh
    语法的超集,所以许多简单的Bash脚本都是有效的
    sh
    脚本
  • 按照rojomoke的建议运行
    sh-n您的_script.sh
    ,它将报告语法错误,而不会实际执行脚本(但可能无法捕获所有问题)
  • 手动检查脚本是否有无效语法(John B的参考不是一个坏的开始),这显然不是一个很好的解决方案,但在实践中,这是唯一可以确定的方法。如果这看起来让人望而生畏,那么,这就是:)
  • 如果您想/需要支持
    sh
    ,最好的选择就是将脚本的shebang指定为
    #/bin/sh
    -如果它在您需要的环境中表现出所需的性能,那么它(根据定义)是兼容的

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


    我问了一个你可能也会觉得有用的问题。

    你可以试试:。但是,即使在您检查了该站点之后,也不能保证它能正常工作。基本上,你需要手动检查每一行,因为当一个表达式语法正确时,并不意味着它仍然是你想要的。在上阅读将是一个好的开始。相关:@hek2mgl是的,它是Ubuntu上的
    dash
    ,如前所述。我在(1)中的观点是,尝试遵从
    sh
    通常并不重要。确切地说,还有什么是“完全错误/无用的”?POSIX模式下的/bin/bash可能用于/bin/sh并不意味着它将运行为bash编写的任何脚本。@hek2mgl我不相信我在任何地方说过这一点-事实上我说的正好相反:“许多简单的bash脚本都是有效的
    sh
    脚本”。这意味着存在Bash脚本,特别是非平凡的脚本,它们是无效的
    sh
    脚本。在讨论进入错误方向之前,我想说的是,“使shell脚本POSIX兼容”任务不是平凡的,并且没有通用的解决方案。虽然您首先要确保不会在shell语法本身中使用bashism,但您还要进一步确保像
    grep
    sed
    awk
    等任何程序都将以一种非常正确的方式被调用,这可能会带来无尽的痛苦,这取决于脚本。@hek2mgl请随意发布您自己的答案。尽我所能,我正试图传达与您相同的信息(理想情况下,只是不要尝试与
    sh
    -兼容)。请注意,尽管OP没有(直接)要求POSIX符合性,但只是要求兼容。虽然它们是相互联系的,但它们是不同的目标。