我的问题似乎与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)
答案 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 。