可以安全地假设安装了 sh 吗?

Safe to assume sh being installed?

我正在使用一系列命令行在 Linux 系统上创建文件、设置变量等。 我不知道哪个 shell 会在执行期间实际使用,但我知道它将是 csh、tcsh、sh、ksh 或 bash.

之一

csh 和 tcsh 不兼容 bourne 是我目前的主要问题,因为它们使用不同的 commands/syntax 来设置变量和条件表达式。

我可以简单地创建一个带有 shebang 的 shell 脚本来切换到 /bin/sh 如果可以安全地假设它存在的话。

因此我想知道:假设 sh 已安装并可用是否安全,或者是否有另一种更优雅的方式来处理不同的 shell 样式而无需创建单独的脚本?

可以安全地假设在 POSIX 兼容系统中有一个 sh,但它的路径可能会有所不同。 Open Group 规范说要确定标准 sh 实用程序的位置:

command -v sh

所以你可以这样做:

"`command -v sh`" <<EOS
echo my super sh script
EOS

但是有一个问题:csh 不支持引用 heredocs,这将使编写脚本的过程变得非常痛苦。

当您以 Linux 为目标时,您可以直接编写 sh 脚本并使用 shebang #!/bin/sh#!/usr/bin/env sh.

请注意,脚本中设置的变量对父级不可用 shell。为此,您需要 source 脚本,在这种情况下,语法很重要,您必须至少编写它的 shcsh 版本。