对于 Linux/MacOS/UNIX 最好的兼容性应该使用哪个 shell?

xav*_*xav 3 unix linux macos shell compatibility

我的问题似乎与 SO 问题“我应该使用什么 Linux shell? ”有关,但我的问题是知道应该使用哪个 shell 来编写应用程序启动脚本,知道这是一个跨平台的 Java 应用程序(几乎所有 Linux发行版,MacOS,Solaris,...)。所以我在这里添加兼容性问题

请注意,我一般不是在问 “哪个是最好的外壳使用”(在我看来这可能没有意义:主观,取决于需求),但我想知道哪个外壳有最好的机会,今天,可在大多数操作系统上使用(并适用于 Java 应用程序启动)。

另外,我可以只需要使用shebang#!/bin/bash“使用bash”吗?(或例如#!/bin/ksh对于 Korn shell)。如果此外壳在此操作系统上不可用怎么办?

我们实际上正在使用带有 shebang 的“.sh”文件#!/bin/sh(我猜是 Bourne shell),但有些用户抱怨某些 Linux 发行版上的错误(我们还不知道他们使用的是哪个发行版,但我们想有一个更全局的方法,而不是一个一个地修复错误)。MacOS 目前使用 bash 作为默认 shell,但此时我们在 MacOS 上使用/bin/sh...

注意:我们希望避免使用多个启动脚本(即使用不同的 shell)

Chr*_*odd 5

为了获得最大的可移植性,最好的办法是/bin/sh使用POSIX sh 功能(无扩展)。您选择的任何其他 shell 可能没有安装在某些系统上(BSD 很少有 bash,而 Linux 很少有 ksh)。

您经常会遇到的问题是,/bin/sh 实际上并不是 Bourne sh 或严格的 POSIX sh——它通常只是 /bin/bash 或 /bin/ksh 的链接,它以 sh 兼容性运行其他 shell模式。这意味着虽然任何 POSIX sh 脚本都应该运行良好,但也会支持一些扩展,这些扩展会导致每个 POSIX 非法的东西也可以运行。所以你可能有一个你认为很好的脚本(当你测试它时运行良好),但它实际上取决于其他 shell 不支持的一些 bash 或 ksh 扩展。

您可以尝试在 POSIX 兼容模式下使用多个 shell 运行您的脚本(例如,bash、ksh 和 dash)并确保它在所有这些 shell 上运行,并且您不会意外地使用某些仅支持一个扩展的扩展。