sh 和 Bash 的区别

Posted

技术标签:

【中文标题】sh 和 Bash 的区别【英文标题】:Difference between sh and Bash 【发布时间】:2011-08-09 04:16:57 【问题描述】:

在编写shell程序时,我们经常使用/bin/sh/bin/bash。我一般用bash,但不知道它们有什么区别。

Bash 和sh 的主要区别是什么?

在使用 Bash 和sh 编程时我们需要注意什么?

【问题讨论】:

有关适用于 Bourne shell 的 bashism 和相应代码的有用列表,请参阅 mywiki.wooledge.org/Bashism 您可能想查看 sh 的 POSIX 标准及其命令语言: * sh * Shell Command Language 作为一般规则,由于它的 posix 兼容性,所有 sh 脚本都将在 bash 下运行,但并非所有 bash 脚本都可以在 sh 下运行,您注意到的主要区别是 [[ ]] 而不是[ ] 比较允许不带引号的空格, $(( )) 代替 $[ ] 算术表达式,以及直接来自 bash 文档的“它太大太慢”之类的其他内容。但是新的脚本编写者不必将自己限制在 sh-兼容的脚本,除非他们是为了向后兼容而拍摄的,现在通常情况并非如此,毕竟它是(或曾经......)2014 年,对吗?? 【参考方案1】:

sh: http://man.cx/sh 重击:http://man.cx/bash

TL;DR:Bash 是sh 的超集,具有更优雅的语法和更多功能。在几乎所有情况下都可以安全地使用 Bash shebang 行,因为它在现代平台上非常普遍。

注意:在某些环境中,sh Bash。检查sh --version

【讨论】:

如果 bash 作为 sh 调用,它的行为会有所不同。请参阅 gnu.org/software/bash/manual/bashref.html#Bash-Startup-Files(“使用名称 sh 调用”)和 gnu.org/software/bash/manual/bashref.html#Bash-POSIX-Mode。例如,没有进程替换。 由于 bash 是 sh 的超集,并且某些操作系统(如 FreeBSD)默认没有安装 bash,因此在 sh 中编写脚本将提供更大的可移植性。 由于没有可移植的脚本方式来获取特定脚本的 POSIX shell,因此可移植脚本不能假设比 Bourne Shell 功能更多。【参考方案2】:

什么是sh?

sh(或Shell 命令语言)是POSIX standard 描述的一种编程语言。它有很多实现(ksh88,Dash,...)。 Bash 也可以被视为sh 的实现(见下文)。

因为sh 是规范,而不是实现,所以/bin/sh 是大多数POSIX 系统上实际实现的符号链接(或硬链接)。

什么是 Bash?

Bash 最初是一个与sh 兼容的实现(尽管它比 POSIX 标准早了几年),但随着时间的推移,它已经获得了许多扩展。许多这些扩展可能会改变有效 POSIX shell 脚本的行为,因此 Bash 本身并不是一个有效的 POSIX shell。相反,它是 POSIX shell 语言的一种方言。

Bash 支持--posix 开关,这使其更符合 POSIX。如果调用为 sh,它还会尝试模仿 POSIX。

sh = bash?

很长一段时间以来,/bin/sh 在大多数 GNU/Linux 系统上都指向 /bin/bash。因此,忽略两者之间的差异几乎是安全的。但这种情况最近开始发生变化。

/bin/sh 不指向 /bin/bash(其中一些甚至可能不存在 /bin/bash)的系统的一些流行示例是:

    现代 Debian 和 Ubuntu 系统,默认将 sh 符号链接到 dash; Busybox,通常在 Linux 系统启动期间作为 initramfs 的一部分运行。它使用ash shell 实现。 BSD 系统,通常是任何非 Linux 系统。 OpenBSD 使用 pdksh,KornShell 的后代。 FreeBSD 的sh 是原始Unix Bourne shell 的后代。 Solaris 有自己的 sh 很长一段时间都不符合 POSIX 标准;可从Heirloom project 获得免费实施。

您如何找出/bin/sh 在您的系统上指向的内容?

复杂之处在于/bin/sh 可能是符号链接或硬链接。如果是符号链接,portable 的解决方法是:

% file -h /bin/sh
/bin/sh: symbolic link to bash

如果是硬链接,试试

% find -L /bin -samefile /bin/sh
/bin/sh
/bin/bash

事实上,-L 标志涵盖了符号链接和硬链接, 但这种方法的缺点是不便携—— POSIX does not require find 支持-samefile 选项,尽管GNU find 和FreeBSD find 都支持它。

社邦线

最终,由您决定使用哪一个,将 «shebang» 行写为脚本的第一行。

例如

#!/bin/sh

将使用sh(以及所指向的任何内容),

#!/bin/bash

如果可用,将使用/bin/bash(如果不可用,则会失败并显示错误消息)。当然,你也可以指定另一个实现,例如

#!/bin/dash

使用哪个

对于我自己的脚本,我更喜欢sh,原因如下:

它是标准化的 更简单,更容易学习 它可以跨 POSIX 系统移植——即使它们碰巧没有bash,它们也必须有sh

使用bash 也有好处。它的特性使编程更方便,类似于用其他现代编程语言进行编程。这些包括范围局部变量和数组之类的东西。 Plain sh 是一种非常简约的编程语言。

【讨论】:

如果你运行一个带有bash的脚本,在语法错误的情况下会显示更多有用的错误信息。您可以通过使用 bash 来节省时间。 命令行开头的% 是什么意思? @JosephHarriott 这是一个提示符:shell 本身打印的一个字符,之后您的命令会跟随。一些 shell 使用 $ 而不是 %,或使用 # 作为 root shell。 @RomanCheplyaka 哪个壳?我只见过$#... @JosephHarriott - % 通常是 C Shell 种类(例如 csh、tcsh)的 user shell 的提示符。 # 传统上被保留为 superuser (root) shell 的提示符,无论选择哪一个。但这都是在历史/传统上观察到的常见/典型用法领域。您可以使用您喜欢的和/或您的用户可以容忍的。 :) Google on how【参考方案3】:

Shell 是用户和操作系统之间用于访问操作系统服务的接口。它可以是 GUI 或 CLI(命令行界面)。

sh (Bourne shell) 是一个 shell 命令行解释器,用于 Unix/类 Unix 操作系统。它提供了一些内置命令。在脚本语言中,我们将解释器表示为#!/bin/sh。它是 bash(免费/开放)、kash(非免费)等其他 shell 最广泛支持的一种。

BashBourne again shell)是 Bourne shell 的 shell 替代品。 Bash 是 sh 的超集。 Bash 支持 sh。 POSIX 是一组标准,定义了符合 POSIX 的系统应该如何工作。 Bash 实际上不是 POSIX 兼容的 shell。在脚本语言中,我们将解释器表示为#!/bin/bash

类比:

Shell 就像一个接口或规范或 API。 sh 是一个实现Shell 接口的类。 Bash 是 sh 的子类。

【讨论】:

我不明白。您已经提到“Bash 是 sh 的超集”和“Bash 是 sh 的子类”,它们不是相反的说法吗?你能澄清一下吗? 我认为这是试图说 Bash 继承自 sh(因此它是 OOP 意义上的“子类”)并扩展它(因此具有功能的超集)。 Shell和sh不一样? 截图很奇怪;它从何而来?如果 Bash 的“基础语法”是 sh,那么它也应该被列为 ksh 的基础语法。相反,您可能会争辩说 Bash 的底层语法是 ksh,因为多年来 Bash 大量借鉴了 Korn shell。【参考方案4】:

/bin/sh 可能会或可能不会调用与/bin/bash 相同的程序。

sh至少支持required by POSIX 的功能(假设实现正确)。它也可能支持扩展。

bash,“Bourne Again Shell”,实现了 sh 和 bash 特定扩展所需的功能。完整的扩展集太长,无法在此处描述,并且随着新版本的不同而有所不同。这些差异记录在 bash 手册中。输入 info bash 并阅读“Bash 功能”部分(当前版本中的第 6 部分),或阅读 current documentation online。

【讨论】:

sh 只为您提供 POSIX shell,前提是您在当前 shell 中设置了正确的 PATH。没有为您提供 POSIX shell 的已定义路径名称。 很长一段时间以来,sh 不一定甚至为您提供 POSIX shell,例如在 Solaris 上。【参考方案5】:

其他答案通常指出了 Bash 和 POSIX shell 标准之间的区别。但是,当编写可移植的 shell 脚本并习惯于 Bash 语法时,典型的 bashism 列表和相应的纯 POSIX 解决方案非常方便。当 Ubuntu 从 Bash 切换到 Dash 作为默认系统 shell 时,已编译此类列表,可在此处找到: https://wiki.ubuntu.com/DashAsBinSh

此外,还有一个名为 checkbashisms 的出色工具可以检查脚本中的 bashism,当您想确保脚本可移植时,它会派上用场。

【讨论】:

这基本上就是我刚才的回答真正归结为的内容。 +1【参考方案6】:

发自UNIX.COM

外壳功能

下表列出了我认为会让您选择一个外壳而不是另一个外壳的大多数功能。它不是一个明确的列表,也不包括每个可能的 shell 的每个可能的特性。只有在操作系统附带的版本中,或者如果它可以直接从标准发行版编译获得,则该功能才被视为在 shell 中。特别是下面指定的 C shell 是在 SUNOS 4.* 上可用的,相当多的供应商现在提供 tcsh 或他们自己的增强型 C shell(他们并不总是清楚地表明他们正在提供 tcsh。

代码:

                                     sh   csh  ksh  bash tcsh zsh  rc   es
Job control                          N    Y    Y    Y    Y    Y    N    N
Aliases                              N    Y    Y    Y    Y    Y    N    N
Shell functions                      Y(1) N    Y    Y    N    Y    Y    Y
"Sensible" Input/Output redirection  Y    N    Y    Y    N    Y    Y    Y
Directory stack                      N    Y    Y    Y    Y    Y    F    F
Command history                      N    Y    Y    Y    Y    Y    L    L
Command line editing                 N    N    Y    Y    Y    Y    L    L
Vi Command line editing              N    N    Y    Y    Y(3) Y    L    L
Emacs Command line editing           N    N    Y    Y    Y    Y    L    L
Rebindable Command line editing      N    N    N    Y    Y    Y    L    L
User name look up                    N    Y    Y    Y    Y    Y    L    L
Login/Logout watching                N    N    N    N    Y    Y    F    F
Filename completion                  N    Y(1) Y    Y    Y    Y    L    L
Username completion                  N    Y(2) Y    Y    Y    Y    L    L
Hostname completion                  N    Y(2) Y    Y    Y    Y    L    L
History completion                   N    N    N    Y    Y    Y    L    L
Fully programmable Completion        N    N    N    N    Y    Y    N    N
Mh Mailbox completion                N    N    N    N(4) N(6) N(6) N    N
Co Processes                         N    N    Y    N    N    Y    N    N
Builtin artithmetic evaluation       N    Y    Y    Y    Y    Y    N    N
Can follow symbolic links invisibly  N    N    Y    Y    Y    Y    N    N
Periodic command execution           N    N    N    N    Y    Y    N    N
Custom Prompt (easily)               N    N    Y    Y    Y    Y    Y    Y
Sun Keyboard Hack                    N    N    N    N    N    Y    N    N
Spelling Correction                  N    N    N    N    Y    Y    N    N
Process Substitution                 N    N    N    Y(2) N    Y    Y    Y
Underlying Syntax                    sh   csh  sh   sh   csh  sh   rc   rc
Freely Available                     N    N    N(5) Y    Y    Y    Y    Y
Checks Mailbox                       N    Y    Y    Y    Y    Y    F    F
Tty Sanity Checking                  N    N    N    N    Y    Y    N    N
Can cope with large argument lists   Y    N    Y    Y    Y    Y    Y    Y
Has non-interactive startup file     N    Y    Y(7) Y(7) Y    Y    N    N
Has non-login startup file           N    Y    Y(7) Y    Y    Y    N    N
Can avoid user startup files         N    Y    N    Y    N    Y    Y    Y
Can specify startup file             N    N    Y    Y    N    N    N    N
Low level command redefinition       N    N    N    N    N    N    N    Y
Has anonymous functions              N    N    N    N    N    N    Y    Y
List Variables                       N    Y    Y    N    Y    Y    Y    Y
Full signal trap handling            Y    N    Y    Y    N    Y    Y    Y
File no clobber ability              N    Y    Y    Y    Y    Y    N    F
Local variables                      N    N    Y    Y    N    Y    Y    Y
Lexically scoped variables           N    N    N    N    N    N    N    Y
Exceptions                           N    N    N    N    N    N    N    Y

上表的键。

Y 功能可以使用这个 shell 来完成。

shell 中不存在 N 个功能。

F 功能只能通过使用 shells 功能来完成 机制。

L 必须将 readline 库链接到 shell 才能启用 此功能。

上表注释

    此功能在原始版本中没有,但后来成为 几乎是标准的。 此功能相当新,因此通常在许多设备上都找不到 版本的外壳,它正在逐渐进入 标准分布。 很多人认为这个 shell 的 Vi 仿真是 不完整。 此功能不是标准功能,但存在非官方补丁 执行此操作。 名为“pdksh”的版本是免费提供的,但没有 AT&T 版本的全部功能。 这可以通过 shell 可编程完成机制来完成。 只能通过 ENV 环境变量指定文件。

【讨论】:

你的表对我没有用,因为它试图比较 1988 年之前的 Bourne Shell 的特性和 ksh 的特性。如果你真的为 1988 年制作了一个表,你需要删除大部分该表中的其他 shell - 包括 bash、sh 和 rc。你能解释一下你的表的值是从哪里得到的吗? 让我给出一些提示:Job Control 于 1989 年被添加到 Bourne Shell 中,Bourne Shell 于 2005 年成为开源的。Korn shell 至少从 1988 年开始具有进程替换,自 1997 年以来它是开源的. 顺便说一句:您关于 $ENV 的陈述不正确,$ENV 仅对交互式 shell 读取/执行。 @schily 此帖已从cs.virginia.edu/helpnet/Computer_OS/unix/shells/shelldiff.html捕获 @schily 如果您觉得它在任何地方都不正确,请随时进行适当的编辑。 根据 schily 暴露的情况,似乎最好删除这个答案,因为它本质上是欺诈性的,而且 OP 并没有真正审查他粘贴的信息。【参考方案7】:

终端

打开窗口的程序 xterm、rxvt、konsole、kvt、gnome-terminal、nxterm 和 eterm。

外壳

是在终端中运行的程序 Shell 既是命令解释器又是编程语言 Shell 只是一个执行命令的宏处理器。 宏处理器是指扩展文本和符号以创建更大表达式的功能。

SH 对比。重击

SH

(壳) 是一个特定的shell 命令解释器和编程语言 BASH 的前身

重击

(Bourne-Again SHell) 是一个特定的shell 命令解释器和编程语言 具有 sh 功能等 SH的继任者 BASH 是默认的 SHELL

参考材料:

外壳 gnu.org:

在其基础上,shell 只是一个宏处理器,它执行 命令。 宏处理器一词是指文本和 符号被扩展以创建更大的表达式。

Unix shell 既是命令解释器又是编程语言。 作为命令解释器,shell 为 丰富的 GNU 实用程序。编程语言功能允许 这些实用程序要结合起来。包含命令的文件可以是 创造,并成为自己的命令。这些新命令具有 与 /bin 等目录中的系统命令状态相同,允许 用户或组建立自定义环境以自动化他们的 常见任务。

Shell 可以交互或非交互方式使用。在互动 模式,它们接受从键盘输入的输入。执行时 shell 以非交互方式执行从文件中读取的命令。

shell 允许同步执行 GNU 命令 异步。 shell 等待同步命令完成 在接受更多输入之前;异步命令继续执行 与 shell 并行,同时读取和执行额外的 命令。重定向构造允许细粒度控制 这些命令的输入和输出。此外,外壳允许 控制命令环境的内容。

Shell 还提供一小组内置命令(builtins) 实现不可能或不方便通过以下方式获得的功能 单独的实用程序例如 cd、break、continue 和 exec 不能 在 shell 之外实现,因为它们直接操作 外壳本身。 history、getopts、kill 或 pwd 内置函数,其中 其他,可以在单独的实用程序中实现,但它们更多 方便用作内置命令。所有的 shell 内置函数都是 在后面的章节中描述。​​

虽然执行命令是必不可少的,但大部分功能(以及 shell 的复杂性)是由于它们的嵌入式编程语言。 像任何高级语言一样,shell 提供变量、流 控制结构、引用和函数。

Shell 提供专为交互式使用而设计的功能,而不是 而不是增加编程语言。这些互动功能 包括作业控制、命令行编辑、命令历史和 别名。本手册中描述了这些功能中的每一个。

重击 gnu.org:

Bash 是 GNU 的 shell 或命令语言解释器 操作系统。这个名字是“Bourne-Again SHell”的首字母缩写, 对斯蒂芬伯恩的双关语,他的直系祖先的作者 当前的 Unix shell sh,出现在第七版贝尔实验室 研究版 Unix。

Bash 在很大程度上与 sh 兼容并包含有用的功能 来自 Korn shell ksh 和 C shell csh。它旨在成为一个 IEEE POSIX Shell 和工具部分的一致实现 IEEE POSIX 规范(IEEE 标准 1003.1)。它提供 在交互和编程方面对 sh 的功能改进 使用。

虽然 GNU 操作系统提供其他 shell,包括 csh 的版本,Bash 是默认的 shell。与其他 GNU 软件一样, Bash 非常便携。它目前几乎可以在每个版本的 Unix 和其他一些操作系统 - 独立支持的端口 适用于 MS-DOS、OS/2 和 Windows 平台。

【讨论】:

【参考方案8】:

对于尝试使用sh 并惊讶于它的行为与bash 不同的人来说,这个问题经常被提名为规范。以下是常见误解和陷阱的简要说明。

首先,您应该了解会发生什么。

如果您使用sh scriptname 运行您的脚本,或者使用scriptname 运行它并且在shebang 行中有#!/bin/sh,您应该期待POSIX sh 行为。 如果您使用 bash scriptname 运行脚本,或者使用 scriptname 运行它并在 shebang 行中使用 #!/bin/bash(或本地等效项),您应该会遇到 Bash 行为。

拥有正确的 shebang 并通过仅输入脚本名称(可能带有 relative or full path)来运行脚本通常是首选的解决方案。除了正确的 shebang 之外,这还需要脚本文件具有执行权限 (chmod a+x scriptname)。

那么,它们实际上有何不同?

Bash 参考手册有一个section which attempts to enumerate the differences,但一些常见的混淆来源包括

[[sh 中不可用(只有 [ 更笨重和有限)。另见Difference between single and double square brackets in Bash sh 没有数组。 localsourcefunctionshoptletdeclareselect 等一些 Bash 关键字不能移植到 sh。 (一些sh 实现支持例如local。) Bash 有许多 C 风格的语法扩展,例如三参数 for((i=0;i<=3;i++)) 循环、+= 增量赋值等。$'string\nwith\tC\aescapes' 功能暂时是 accepted for POSIX(意味着它现在可以在 Bash 中使用,但不会在仅遵循当前 POSIX 规范的系统上得到 sh 的支持,并且可能在未来一段时间内不会支持)。 Bash 支持<<<'here strings'。 Bash 具有 *.png,jpg0..12 大括号扩展。 Bash 扩展了通配功能,例如 ** (globstar) 用于递归子目录,extglob 用于使用不同的 more versatile wildcard syntax. ~ 仅在 Bash 中指代$HOME(更一般地,~usernameusername 的主目录)。这是在 POSIX 中,但在某些 pre-POSIX @ 中可能缺少987654374@ 实现。 Bash 使用<(cmd)>(cmd) 进行进程替换。 Bash 具有 Csh 风格的便捷重定向别名,例如 &| 代表 2>&1 |&> 代表 > ... 2>&1 Bash 支持带有<> 重定向的协同进程。 Bash 具有丰富的扩展非标准参数扩展集,例如$substring:1:2$variable/pattern/replacement、大小写转换等。 Bash 显着扩展了 shell 算术功能(尽管仍然不支持浮点)。有一个过时的旧式 $[expression] 语法,但应替换为 POSIX 算术 $((expression)) 语法。 (不过,一些遗留的 pre-POSIX sh 实现可能不支持这一点。) 一些内置命令具有不可移植的选项,例如type -aprintf -v 和常年echo -e$RANDOM$SECONDS$PIPESTATUS[@]$FUNCNAME 等魔术变量是 Bash 扩展。 语法差异,如 export variable=value [ "x" == "y" ] 不可移植(export variable 应与变量赋值分开, [ ... ] 中的可移植字符串比较使用单个等号)。 许多仅用于 Bash 的扩展,用于启用或禁用可选行为并公开 shell 的内部状态。 许多用于交互使用的便利功能,但不会影响脚本行为。

请记住,这是一个精简列表。请参阅参考手册以获取完整的独家新闻,并参阅http://mywiki.wooledge.org/Bashism 了解许多好的解决方法;和/或尝试http://shellcheck.net/,它会警告许多仅限 Bash 的功能。

一个常见的错误是有一个#!/bin/bash shebang 行,但是仍然使用sh scriptname 来实际运行脚本。这基本上禁用了任何仅 Bash 的功能,因此您会遇到语法错误,例如尝试使用数组。 (shebang 行在语法上是一个注释,因此在这种情况下它被简单地忽略了。)

不幸的是,当您尝试使用这些构造时,当 Bash 被调用为 sh 时,它不会发出警告。它也不会完全禁用 所有 Bash 专用功能,因此通过将其调用为 sh 来运行 Bash 并不是检查您的脚本是否可以正确移植到 ash/@ 的好方法987654330@/POSIX sh 或类似Heirloom sh的变体

【讨论】:

从根本上说,TL;DR 版本是And's answer。 shellcheck.net 是我所需要的。非常感谢。 FWIW,export variable=value 由 POSIX 强制要求:pubs.opengroup.org/onlinepubs/009695399/utilities/export.html。也许它在一些古代贝壳中没有,但绝对不是bashism。【参考方案9】:

Linux 操作系统提供不同类型的 shell。尽管 shell 有许多共同的命令,但每种类型都有独特的功能。 让我们研究一下最常用的不同类型的 shell。

嘘壳:

Sh shell 也称为 Bourne shell。 Sh shell 是 1977 年由 AT&T 贝尔实验室的 Stephen Bourne 为 Unix 计算机开发的第一个 shell。它包含许多脚本工具。

Bash 外壳:

Bash shell 代表 Bourne Again Shell。 Bash shell 是大多数 Linux 发行版中的默认 shell,可以替代 Sh shell(Sh shell 也将在 Bash shell 中运行)。 Bash shell 无需修改即可执行绝大多数 Sh shell 脚本,还提供命令行编辑功能。

【讨论】:

Ken Thompson 有一个较早的 shell。 Bourne shell 在 v7 Unix (1979) 中正式引入。【参考方案10】:

bash 和 sh 是两个不同的 shell。基本上 bash 是 sh,具有更多功能和更好的语法。大多数命令的工作方式相同,但它们不同。Bash (bash) 是众多可用(但也是最常用)的 Unix shell 之一。 Bash 代表“Bourne Again SHell”,是原始 Bourne shell (sh) 的替换/改进。

Shell 脚本是在任何 shell 中编写脚本,而 Bash 脚本是专门为 Bash 编写的脚本。然而,在实践中,“shell 脚本”和“bash 脚本”通常可以互换使用,除非所讨论的 shell 不是 Bash。

话虽如此,您应该意识到大多数系统上的 /bin/sh 将是一个符号链接,并且不会调用 sh。在 Ubuntu 中,/bin/sh 曾经链接到 bash,这是 Linux 发行版上的典型行为,但现在已更改为链接到另一个名为 dash 的 shell。我会使用 bash,因为这几乎是标准(或者至少是最常见的,根据我的经验)。事实上,当 bash 脚本使用 #!/bin/sh 时会出现问题,因为脚本制作者假定链接是 bash,而实际上并非必须如此。

【讨论】:

【参考方案11】:

它们几乎相同,但 bash 具有更多功能sh(或多或少)是 bash 的旧子集。

sh 通常表示原始的Bourne shell,它早于bash (Bourne *again* shell),创建于 1977 年。但实际上,最好将其视为高度交叉的兼容外壳,符合 1992 年的 POSIX 标准。

#!/bin/sh 开头或使用sh shell 的脚本通常这样做是为了向后兼容。任何 unix/linux 操作系统都会有一个sh shell。在 Ubuntu 上 sh 经常调用 dash 而在 MacOS 上它是 bash 的特殊 POSIX 版本。对于符合标准的行为、速度或向后兼容性,这些 shell 可能是首选。

bash 比原来的sh 更新,增加了更多功能,并寻求与sh 向后兼容。 sh 程序通常可以在 bash 中正常运行。 bash 在几乎所有 linux/unix 机器上都可用,并且通常默认使用 - 除了 MacOS 默认为 zsh 的 Catalina (10.15)。 FreeBSD 默认没有安装bash

【讨论】:

sh 远远早于 POSIX。现在,您希望找到的任何sh 至少与 POSIX 兼容;但在遗留系统上,这绝不是给定的。 POSIX 的标准化远远超过外壳;事实上,您可以说操作系统调用和库函数的标准化更为重要。 我删除了关于 POSIX 的内容以减少混乱 sh 程序在实践中应该在 Bash 中运行良好,而不仅仅是 “理论上”。 显然存在一些极端情况,例如脚本使用保留名称的变量由 Bash 而非其他 shell。【参考方案12】:

以最简单的方式解释差异:

有了基本的了解之后,其他的答案就会更容易理解了。

Shell - “Shell”是一个程序,它促进了用户与操作系统(内核)之间的交互。有许多可用的 shell 实现,如 sh、Bash、C shell、Z shell 等。

使用任何 shell 程序,我们将能够执行该 shell 程序支持的命令。

Bash - 它源自 Bourne-again Shell。使用这个程序,我们将能够执行 shell 指定的所有命令。此外,我们将能够执行一些专门添加到该程序中的命令。 Bash 向后兼容 sh。

Sh - 它源自 Bourne Shell。 "sh" 支持 shell 中指定的所有命令。这意味着,使用这个程序,我们将能够执行Shell指定的所有命令。

有关详细信息,请参阅:

dash Bash

【讨论】:

要了解POSIX,请阅读Alex的回复,请查看:***.com/a/1780614/1261003 我不想理解 POSIX。我正在审查你的答案,因此我需要看到你的答案增加了价值。我认为不会。 我相信这些小小的说明会帮助新手更轻松地理解上述讨论中使用的行话。 @Scratte

以上是关于sh 和 Bash 的区别的主要内容,如果未能解决你的问题,请参考以下文章

sh 和 Bash 的区别

Linux-SHELL中sh和bash的区别

bash和 csh 区别

sh和bash的区别

shell里一个let命令,用sh跑不了,但bash可以,发现bin里面sh是dash的链接,那么sh和bash功能上啥区别

linux基础:shell中的sh与bash区别与常用命令