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

use*_*057 8 shell bash dash shell-script

bash 和 sh 之间的区别

ABck的问题:如果你有/bin/sh一个链接的bash,那么bash将不会调用时为具有相同的行为/bin/sh,因为它不会在调用时/bin/bash。当调用 as 时sh,它会将自身限制为主要符合 POSIX 标准以及一组有限的扩展。

这是否意味着每当我在 Linux 中遇到带有 shebang 到 sh: 的 shell 脚本时#!/bin/sh,即使在那个发行版上,它bin/sh也是另一个 shell 的符号链接,如 dash 或 bash,它应该与 bourne shell 100% 兼容,因为它限制自己到一组有限的扩展?那么我可以在 FreeBSD 中执行它们吗?有例外吗?或者我应该可以安全地假设它会起作用?

因此,如果在发行版上,bin/sh是指向 的符号链接bin/bash,并且脚本使用#!/bin/sh并且脚本包含 bashism,则它不会运行,因为 bash 会处于 sh 模式?

Ulr*_*gel 16

不,如果/bin/sh是 bash 的符号链接 bash 仅进入 posix 模式 - 来自man bash

当作为 sh 调用时,bash 在读取启动文件后进入 posix 模式。

如果你现在在搜索POSIX模式,bash的手册页,你会看到一些shell内建类似timesource不同的表现。就这些。bashishms 喜欢function在声明函数之前编写或使用source而不是.仍然可以工作,但命令的行为可能会有所不同。

所以 if/bin/sh/bin/bash所有典型 bashishms的符号链接仍然有效。

有关 Posix 模式差异的相当广泛的列表,请查看bash 参考手册

  • @MaxCoplan 通过第零个参数(C 中的“argv[0]”)。 (2认同)

Sté*_*las 7

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))。甚至 zsh 也有一种模式,它主要符合 POSIX。

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...)