根据这篇文章,dash
被选为/bin/sh
因为bash
速度较慢:Dash as /bin/sh
是否有具体数字说明速度快多少dash
?
bash
如果您使用而不是dash
启动 Ubuntu ,需要多长时间?
上述链接的论点今天仍然有效吗?对于背景:system-v init 使用了很多 shell 脚本,但 systemd 没有。
这个问题与综合基准测试中的速度无关。这关乎最终用户的整体显着利益。关于 dash 与 bash 速度的综合基准无法回答这个问题。
根据这篇文章,dash
被选为/bin/sh
因为bash
速度较慢:Dash as /bin/sh
是否有具体数字说明速度快多少dash
?
bash
如果您使用而不是dash
启动 Ubuntu ,需要多长时间?
上述链接的论点今天仍然有效吗?对于背景:system-v init 使用了很多 shell 脚本,但 systemd 没有。
这个问题与综合基准测试中的速度无关。这关乎最终用户的整体显着利益。关于 dash 与 bash 速度的综合基准无法回答这个问题。
此测试不代表启动过程,但您可以通过制作一个小测试脚本来简单地尝试自己,我称之为
shspeed
:这只是一个接一个地分叉 10000 个子壳。现在用 bash 和 dash 运行它并计时:
所以,它在我的硬件上要快得多,它是大约 1 年的戴尔 XPS 13 9365。你可以想象它在低端硬件上会产生更大的差异。此外,这个测试只是关于一个 for 循环并产生一个子 shell。也许对于某些测试,结果会更加显着。
当然,您可以忽略这一点并说您不在乎生成 10000 个子壳的速度有多快。好吧,有些人似乎在乎:)
对于您的特定引导过程,它可能不会产生任何明显的差异。
/bin/bash
如果您使用as/bin/sh
并用秒表测量差异,我认为没有问题。请查看@wjandrea 的这些链接以获取有关此事的详细说明:https ://wiki.ubuntu.com/DashAsBinSh ,将 sh 链接到 dash 有什么意义?
以 systemd 为单位的 shell 速度
在你修改你的问题之后,听起来你对哪个 shell 更快并不感兴趣,但更多的是为什么我们仍然坚持让启动过程快半秒(左右),特别是现在我们不使用 shell 脚本与我们在 sysv-init 成为标准时所做的相同程度。
由于我不参与 Ubuntu 的政治,我将尝试给出一个在我看来的答案:
如果您可以通过简单地使用指向另一个 shell 的符号链接来加快半秒的速度,那是值得的。
让默认 shell 只做 POSIX 要求默认 shell 做的事情是有意义的,以保持事情的可移植性。想象一下,一个发行版在初始化脚本中使用了另一个发行版(还没有)的 bash 功能。
(d)ash 也被添加到能够修复标准脚本中的 bashisms,并在未来避免它们。
/bin/sh
是一个商定的标准,大型基础设施所依赖的东西。我不想用具有更大代码库和不需要的功能的东西来代替。使用更少的 CPU 周期和内存总是值得的。甚至 systemd 单元也经常在后台运行 shell 脚本。
所有这些对于普通用户来说可能无关紧要,但间接地他们得到的是一个整体更稳定的分布。
为什么不猛击?
这更像是一种观点:就我个人而言,我永远不会选择用破折号编写脚本。它仅提供非常基本的结构。对于更大的软件,我宁愿选择 bash 或 zsh(或者根本不是 shell 的东西)。我可能想使用哪些功能:高级参数扩展、shell 算法、数组,也许还有更多。
这不应该发生在主要用于启动守护进程或安装软件的脚本中。那些应该使用最少的指令集并保持脚本的可读性和简单性。但是,如果 bash 的所有优点都对他们可用,那么它很可能会发生。
/bin/sh
应该主要用于在相当方便的环境中运行外部程序,而不是用于复杂的软件系统。概括
/bin/sh
由 dash 实现的,带来了一种兼容 POSIX 的快速稳定的脚本语言,它可以很好地作为系统 shell 脚本的标准和默认解释器。永远不会为了方便功能而牺牲这些属性。从程序员的角度来看,它实现了“做一件事,把它做好”的口头禅。
它主要不是优化,而是职责分离。
它已经存在,因此无需额外的努力来保持它。
带着最终用户帽子来看这个问题会提出一个问题:什么样的最终用户?桌面用户不在乎,但他们仍然会受益于更稳定(也许更快)的发行版。包维护者会非常关心,并且那些受益于可靠的系统解释器,它具有少量、定义明确和经过良好测试的功能集。程序员不应该关心,因为他们可能不会在
/bin/sh
.PS:bash 二进制文件的大小几乎是 dash 二进制文件的 10 倍!