use*_*057 8 shell bash dash shell-script
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内建类似time或source不同的表现。就这些。bashishms 喜欢function在声明函数之前编写或使用source而不是.仍然可以工作,但命令的行为可能会有所不同。
所以 if/bin/sh是/bin/bash所有典型 bashishms的符号链接仍然有效。
有关 Posix 模式差异的相当广泛的列表,请查看bash 参考手册。
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...)