当 sh 是 bash 或 dash 的符号链接时,bash 将自身限制为 POSIX 合规性,因此它应该与 sh 100% 兼容?

当 sh 是 bash 或 dash 的符号链接时,bash 将自身限制为 POSIX 合规性,因此它应该与 sh 100% 兼容?

bash 和 sh 的区别:

回答这个问题:如果您有/bin/shas 到 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 内置函数的行为类似timesource不同。就这些。像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),但/binSolaris 是一个值得注意的(烦人的)例外。

请注意,在 Bourne shell 出现之前,我们谈论的是 30 多年前,“sh”是 Thompson shell。我们不再编写与 Thompson shell 兼容的脚本。同样,我们应该停止将“sh”视为 Bourne shell。

如今,“sh”是一种规范,而不是许多有时不兼容的实现变体。这使得编写可移植脚本变得更加容易。只需按照规格

这适用于“sh”和所有标准实用程序(sed、cut、tr...)

相关内容