哪个shell应该用于Linux / MacOS / UNIX最佳兼容性?

时间:2014-05-02 21:14:07

标签: linux macos shell unix compatibility

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

请注意我不是要求 "这是最好的shell使用" 一般情况下(可能没有意义)我认为:主观的,取决于需求),但我想知道,在大多数操作系统上,哪个shell最有可能(适用于Java应用程序启动)。

另外,我可以简单地使用shebang #!/bin/bash"使用bash" ? (或者例如Korn shell的#!/bin/ksh)。如果此操作系统上没有此shell,该怎么办?

我们实际上正在使用" .sh"文件与shebang #!/bin/sh(我猜是Bourne shell)但有些用户抱怨某些Linux发行版上的错误(我们还不知道他们使用的是哪一个,但我们希望有更多全局方法,而不是逐个修复错误)。 MacOS目前使用bash作为默认shell,但目前我们使用/bin/sh在MacOS上没有任何问题......

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

2 个答案:

答案 0 :(得分:3)

对于最大可移植性,最好的选择是/bin/sh仅使用 POSIX sh功能(无扩展名)。你选择的任何其他shell可能都没有安装在某个系统上(BSD很少有bash,而Linux很少有ksh)。

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

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

答案 1 :(得分:1)

您将找不到将在每个操作系统上安装的shell实现,但是,它们都符合POSIX标准,或者或多或少接近合规。

然后,您应该将shell脚本限制为尽可能坚持POSIX standard

但是,没有简单的方法可以告诉脚本在POSIX上下文中执行,特别是指定要设置的shebang。我建议使用一个postinstaller脚本,它将在使用此命令检索的目标平台上插入正确的shebang:

#!/bin/sh
printf "#!%s\n" `PATH=\`getconf PATH\` command -v sh`

您的脚本也应该在调用任何外部命令之前包含此指令:

export PATH=$(getconf PATH):$PATH

确保调用的实用程序是POSIX实用程序。此外,请注意,某些Unix实现可能需要为其设置环境变量以使其具有POSIX方式(例如,在Tru64 / OSF1上需要BIN_SH = xpg4,在AIX上需要XPG_SUS_ENV = ON,...)。

要开发脚本,我建议使用标准扩展程度较低的shell,如dash。这将有助于快速检测由基本原理(或kshisms或其他)引起的错误。

PS:请注意,尽管普遍认为,即使在符合POSIX标准的操作系统上, /bin/sh也不能保证符合POSIX