回答这个问题:如果您有
/bin/sh
as 到 bash 的链接,那么 bash 在调用时的行为将不会/bin/sh
与调用 as 时的行为相同/bin/bash
。当调用为 时sh
,它将自身限制为主要符合 POSIX 以及一组有限的扩展。
这是否意味着每当我在 Linux 中遇到带有 sh: 的 shebang 的 shell 脚本时#!/bin/sh
,即使在该发行版上,bin/sh
是另一个 shell(如 dash 或 bash)的符号链接,它也应该与 bourne shell 100% 兼容,因为它把自己限制在一组有限的扩展上吗?那么我可以在 FreeBSD 中执行它们吗?有例外吗?或者我应该可以放心地假设它会起作用?
因此,如果在发行版上,bin/sh
是 的符号链接bin/bash
,并且脚本使用#!/bin/sh
并且脚本包含 bashism,则它不会运行,因为 bash 会处于 sh 模式?
答案1
不,如果/bin/sh
是 bash 的符号链接 bash 只进入 posix 模式 - 来自男人狂欢:
当作为 sh 调用时,bash 在读取启动文件后进入 posix 模式。
如果您现在在以下位置搜索 posix 模式bash 联机帮助页你会发现一些 shell 内置函数的行为类似time
或source
不同。就这些。像function
在声明函数之前编写或使用source
而不是still 之类的 bashishms.
可以工作,但命令的行为可能有所不同。
所以 if是所有典型 bashishms/bin/sh
的符号链接仍然有效。/bin/bash
有关 Posix 模式差异的相当广泛的列表,请查看bash 参考手册。
答案2
Bourne shell 似乎有些混乱。 Bourne shell 是几十年前的 Unix shell,也就是 POSIX 之前的时代。如今,“sh”是实现 POSIX 规范的 shell 的一种或多种实现,其中包括 bash、pdksh、AT&T ksh、较新的 Almquist shell 及其已兼容 POSIX 的衍生产品(包括某些 BSD 的“sh”) ,其他 BSD sh 基于 pdksh 和 Debian ash (dash) - 例如在 Ubuntu 上)。甚至 zsh 也有一种主要符合 POSIX 的模式。您可以通过运行以下命令来检查您的:
# check what sh really is on Ubuntu 22.04
$ ls -nd -- /bin/sh
lrwxrwxrwx 1 0 0 4 Mar 23 2022 /bin/sh -> dash
Bourne shell 不符合 POSIX 标准,并且在当今的许多系统上都找不到。无论找到还是没有找到 Bourne shell,总会有一个符合 POSIX 标准的“sh”(并且不会是 Bourne shell),但/bin
Solaris 是一个值得注意的(烦人的)例外。
请注意,在 Bourne shell 出现之前,我们谈论的是 30 多年前,“sh”是 Thompson shell。我们不再编写与 Thompson shell 兼容的脚本。同样,我们应该停止将“sh”视为 Bourne shell。
如今,“sh”是一种规范,而不是许多有时不兼容的实现变体。这使得编写可移植脚本变得更加容易。只需按照规格。
这适用于“sh”和所有标准实用程序(sed、cut、tr...)