sh 是什么?
sh
POSIX 标准 描述的编程语言 。它有许多实现( ksh88
, Dash ,...)。Bash 也可以被视为 sh
(见下文)的一种实现。
因为 sh
它是一种规范,而不是一种实现, /bin/sh
所以是大多数 POSIX 系统上实际实现的符号链接(或硬链接)。
什么是 Bash?
Bash 最初是一个 sh
兼容 POSIX 的实现(尽管它比 POSIX 标准早几年),但随着时间的推移,它获得了许多扩展。其中许多扩展可能会改变有效 POSIX shell 脚本的行为,因此 Bash 本身并不是一个有效的 POSIX shell。相反,它是 POSIX shell 语言的一种方言。
Bash 支持 --posix
switch,这使其更符合 POSIX 标准。如果以如下方式调用,它还会尝试模仿 POSIX sh
.
sh=bash?
长期以来, /bin/sh
都习惯于使用 /bin/bash
。因此,几乎可以放心地忽略两者之间的差异。但最近这种情况开始发生变化。
不指向 /bin/sh
(并且其中一些 /bin/bash
甚至可能不存在) /bin/bash
的系统常见示例
-
现代 Debian 和 Ubuntu 系统,
sh
下 dash
;
-
Busybox ,通常在 Linux 系统启动时作为 的一部分运行
initramfs
。它使用 ash shell 实现。
-
BSD 系统,以及一般的非 Linux 系统。使用 OpenBSD 。FreeBSD
pdksh
的后代 KornShell 是原始 Unix Bourne shell 的后代。, sh
有自己的 Solaris 但长期以来不符合 POSIX 标准;Heirloom 项目提供 sh
免费 实现 .
如何才能找出 /bin/sh
你的系统上的指向?
复杂之处在于,这 /bin/sh
可能是符号链接或硬链接。如果是符号链接,则可 移植的 解析方法是:
% file -h /bin/sh
/bin/sh: symbolic link to bash
如果是硬链接,请尝试
% find -L /bin -samefile /bin/sh
/bin/sh
/bin/bash
实际上,该 -L
标志涵盖了符号链接和硬链接,但这种方法的缺点是不可移植——POSIX 不要求 find
支持该 -samefile
选项,尽管 GNU find 和 FreeBSD find 支持它。
舍邦线
最终,由您来决定使用哪一个,通过将“shebang”行写为脚本的第一行。
例如
#!/bin/sh
将使用 sh
(以及指向的任何内容),
#!/bin/bash
如果可用, /bin/bash
则使用
#!/bin/dash
使用哪一个
对于我自己的脚本,我更喜欢 sh
以下原因:
-
它是标准化的
-
它更简单,更容易学习
-
它可以跨 POSIX 系统移植——即使它们没有
bash
,也必须有 sh
也 bash
有优势 sh
是一种非常简约的编程语言。