sh
我想知道符号链接的意义dash
是什么?我知道dash
应该比更快bash
,但我不确定为什么原始sh
shell 不存在于中sh
。
或者如果有的话为什么没有sh
链接到bash
?
答案1
对于“为什么原始 sh shell 不存在sh
”的简短回答是没有原始 sh。
好吧,有,这是汤普森壳版本 1 具有我们今天所知道的一些功能,特别是重定向和管道(阅读Dennis Ritchie 关于早期 Unix 历史的论文)。后续版本添加了诸如后台执行&
、通配符(使用外部程序实现)和某些形式的引用等功能,但没有变量或嵌套控制结构。条件和循环由外部程序提供if
(以一个条件和一个命令作为参数)和goto
(通过改变脚本文件中其父文件的位置来实现)。
1979 年,Unix V7,汤普森壳被替换/bin/sh
为伯恩壳. 第一个版本已经许多功能目前已在 dash 中出现,并且后续版本中也引入了还有很多几年后,Korn 壳面世后,其功能不断增强;许多 Unix 变体都以 为名称安装了它ksh
。
1992年,POSIX编纂了一套最低限度的sh
功能,基本上是 Bourne 加上一些功能。任何自称为“Unix”的系统都必须至少实现这些功能。商业 Unix 系统通常使用 ksh 作为 POSIX sh,但少数(例如开放源码框架/1) 有自己的。
直到最近,Bourne shell 和 Korn shell 才成为开源的,因此当 Linux 世界在 20 世纪 90 年代中期开始形成时,它们还不可用。/bin/sh
必须有其他东西。大多数 Linux 发行版都选择了狂欢,来自GNU 项目就脚本功能而言,它介于 Bourne 和 Korn 之间,但在交互使用方面比它们都好得多。唯一可行的替代方案是 pdksh(“公共域 Korn shell”),这是一个免费的(现已停用,但仍在继续使用)韓國,即积极发展),但我不记得有 Linux 发行版使用 pdksh /bin/sh
,我不知道为什么,我猜是因为 Linux 发行版一直都是 GNU/Linux 发行版,基本上只要有 GNU 版本的工具就会发布 GNU 版本。
还有几个sh
称为“ash”的开源实现,最著名的是Almquist 壳但它们非常不完整,缺少一些人们想要使用的 POSIX 功能。一位担任 Debian 维护者的程序员,徐伟,扩展了 ash,使其符合 POSIX 标准。最终他的版本被重命名为 dash,并且有人推动将其制作/bin/sh
在 Debian 而不是 bash 中。Ubuntu 的出现比 Debian 开始系统地将 bashisms(在脚本中使用 bash 特定功能#!/bin/sh
)视为错误. 两人都换了一张较晚的(Ubuntu 6.10,Debian 直到 2009 年才出现(这是 Lenny 的一个进球但切换是在 lenny 发布后才进行的,即在 squeeze))。
一个主要的使用 dash as 而不是 bash 的原因因为/bin/sh
它的速度明显更快。这对于 Ubuntu 来说尤其重要,因为 Ubuntu 从一开始就努力缩短启动时间。Dash 使用的内存也比 bash 少,这对于包装器脚本来说非常重要,因为包装器脚本在底层程序退出时会留下来做一些清理工作。dash 的另一个好处是它只依赖于 libc(核心系统库),而 bash 还依赖于终端支持库(没有它们,它就无法启动,甚至无法运行脚本);这意味着 dash 更有可能在损坏的系统上继续工作。
在 21 世纪的某个时候,Korn shell 开源了,并且出现了 Bourne shell 的开源版本(旧版本,因为开发在几年前就停止了)。但是 dash 和 bash 在 Linux 世界中根深蒂固,以至于它们无法获得任何认可,尤其是 Bourne shell,因为它今天的价值只是历史性的。Dash 取代了 bash,因为它具有明显的优势,但其他竞争对手都没有像 那样具有决定性的优势/bin/sh
。
答案2
速度和 POSIX 兼容性(换句话说,可移植性)是主要因素。请记住,这/bin/sh
是针对系统脚本的,这些脚本可能来自旧版本的 Ubuntu 和/或其他系统,也可能不是。
当然,对于我们这些用户来说,使用 的闪亮功能bash
很酷,但是当涉及到在必须管理多个不同服务器/系统的环境中运行时,拥有符合 POSIX 标准的 shell 会带来很大的不同。特别是,如果您是新的系统管理员并且继承了许多脚本的环境。
至于为什么原始的 Bourne shell 不存在,原因很简单 - 它是 AT&T 贝尔实验室最初拥有的专有产品。
另外,Ubuntu wiki 上实际上对此有明确的解释:
为什么要进行这种更改?切换默认 shell 的主要原因是效率。bash 是一款出色的全功能 shell,适合用于交互;事实上,它仍然是默认的登录 shell。但是,与 dash 相比,它相当庞大,启动和运行速度较慢。Ubuntu 启动过程中会启动大量 shell 实例。Ubuntu 核心开发团队认为,最好只是更改默认 shell,而不是单独更改每个 shell 以明确在 /bin/dash 下运行,这种更改需要大量的持续维护,如果不密切关注,很容易出现倒退。Ubuntu 6.10 中的启动速度改进经常被错误地归因于 Upstart,它是 init 系统未来开发的良好平台,但在 Ubuntu 6.10 中,它主要在 System V 兼容模式下运行,只有很小的行为变化。这些改进实际上很大程度上归功于更改的 /bin/sh。
以下是关于可移植性的说明:
Debian 政策手册早已规定“指定‘/bin/sh’作为解释器的 shell 脚本必须仅使用 POSIX 功能”;事实上,这一要求早在 Ubuntu 项目开始之前就已经存在。此外,任何预期可移植到其他 Unix 系统(如 BSD 或 Solaris)的 shell 脚本都已遵守这一要求。因此,我们认为这一变化对兼容性的影响将微乎其微。
答案3
在 GNU/Linux 发行版中,“原始/bin/sh
”实际上是 Bash。
GNU 想要一个遵循 GPL 的类似 Bourne 的 shell,所以他们选择 Bash 作为/bin/sh
,而不是 Bourne,因为 Bourne 不是 GPL 许可的。现代 Linux 发行版继承了这一决定,以至于/bin/sh
Bash 成为了事实上的标准。最初的 Bourne shell(“sh”)已在其他非 Linux Unix 中使用,甚至最近在 Solaris 10 中也使用过,但它从未成为 Linux 发行版的主流。
从 bash切换/bin/sh
到 dash 是 Debian 的决定(由 Ubuntu 继承),主要出于速度方面的考虑 —— 当时他们投入了巨大的精力来提高启动速度,并且当时启动 CPU 的大部分时间都用于运行初始化脚本。
Bash 继续被用作用户的默认交互/登录 shell,但 Dash 是用于/bin/sh
执行系统脚本(如 init 脚本)的 shell。
Dash 非常快,而且与 POSIX 非常兼容 - 该标准与 Bourne shell 非常一致。因此,从某种意义上说,通过从 Bash 切换到 Dash,我们回到了与 Bourne 更一致的 shell。
答案4
/bin/sh
/bin/dash
我认为是出于兼容性原因而链接到的。许多脚本只是以
#!/bin/sh
因此,通过移动而不建立符号链接,如果根本不存在,dash
很多脚本将无法正常运行(或根本无法运行) 。/bin/sh
bash
之所以从到进行更改,是dash
因为根据https://wiki.ubuntu.com/DashAsBinSh:
切换默认 shell 的主要原因是效率。bash 是一款功能齐全的优秀 shell,适合用于交互;事实上,它仍然是默认的登录 shell。但是,与 dash 相比,它相当庞大,启动和运行速度较慢。Ubuntu 启动过程中会启动大量 shell 实例。Ubuntu 核心开发团队认为,最好直接更改默认 shell,而不是逐个更改它们以使其明确在 /bin/dash 下运行,因为这种更改需要大量的持续维护,如果不密切关注,很容易出现倒退。
sh
未链接到bash
,因为
Debian 政策手册早已规定,“指定‘/bin/sh’作为解释器的 shell 脚本必须仅使用 POSIX 功能”
如果您想bash
使用/bin/sh
:
如果问题更为普遍,并且您想要改回默认系统 shell,那么您可以指示包管理系统停止将 dash 安装为 /bin/sh:
sudo dpkg-reconfigure dash
有些功能是dash
Bash 所不具备的,例如:
甚至有可能,现在有几个脚本依赖于 bash 不提供的 dash 的某些功能!