linux - 应该使用哪个 shell 以获得 Linux/MacOS/UNIX 最佳兼容性?

标签 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 在这个操作系统上不可用怎么办?

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

没有任何问题

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

最佳答案

对于最大 可移植性,最好的选择是/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)并确保它在所有这些 shell 上运行并且您不会不小心使用了一些只有一个支持的扩展。

关于linux - 应该使用哪个 shell 以获得 Linux/MacOS/UNIX 最佳兼容性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23437049/

相关文章:

linux - 如何使用 bash 命令将文件中的多列合并为一列?

android - 缺少 NativeScript ANDROID_HOME

Ruby、bundle、SSH 和 Jenkins

linux - 使用 wpa_supplicant 在树莓派中连接 wifi

linux - 当我调用 my.domain.name::5984/_utils/Couchdb 安装时,我什么也看不到

c - GDB 无法识别某些 C 函数

java - JDialogs 导致我的应用程序菜单在 OSX 上消失

macos - RabbitMQ 命令不存在?

ruby - 将 Shell 脚本转换为 ruby​​ 中的数组

捕获终端的强制退出(顶部的 x 按钮或 ctrl+Z)