将 sh 链接到 dash 有什么意义?

Ner*_*ode 52 bash dash-shell

我想知道sh符号链接的意义dash是什么?我知道这dash应该比 快bash,但我不确定为什么原始sh外壳不存在于sh.

或者如果有什么原因没有sh链接到bash

Gil*_*il' 102

对“为什么原始 sh shell 不存在sh”的简短回答是没有原始 sh。

好吧,有:它是Thompson shell。版本 1 具有我们今天所知道的一些特性,特别是重定向和管道(阅读Dennis Ritchie 关于早期 Unix 历史的论文)。后来的版本添加了诸如后台执行&、通配符(使用外部程序实现)和某些形式的引用等功能,但它没有变量或嵌套控制结构。条件和循环是通过外部程序if(将一个条件和一个命令作为参数)和goto(通过更改其父级在脚本文件中的文件位置来工作)提供的。

在1979年,在Unix的V7,汤普森壳被替换为/bin/sh伯恩壳。第一个版本已经具有今天 dash 中存在的许多功能,随后的版本引入了更多. 几年后,Korn shell出现了,其功能集不断增加;许多 Unix 变体都以 名称安装它ksh

1992 年,POSIX编写了一组最基本的sh功能,这些功能基本上是 Bourne 加上一些东西。任何自称为“Unix”的系统都必须至少实现这些功能。商业 Unix 系统通常使用 ksh 作为 POSIX sh,但少数(例如OSF/1)有自己的。

Bourne shell 和 Korn shell 直到最近才开源,所以当 Linux 世界在 1990 年代中期开始形成时,它们不可用。/bin/sh必须是别的东西。大多数 Linux 发行版都使用bash,这是一个来自GNU 项目的 shell,在脚本功能方面往往介于 Bourne 和 Korn 之间,并且在交互使用方面比两者都好得多)。唯一可行的替代方案是 pdksh(“公共域 Korn shell”),一个免费的(现已停产,但作为mksh 继续存在,它正在积极开发),但我不记得使用 pdksh 作为 Linux 发行版/bin/sh,我不知道为什么,我猜是因为 Linux 发行版始终是 GNU/Linux 发行版,基本上是发布任何存在 GNU 版本的工具的 GNU 版本。

还有几个sh名为“ash”的开源实现,最著名的是Almquist shell,但它们非常不完整,缺乏人们想要使用的一些 POSIX 功能。作为 Debian 维护者的程序员Herbert Xu扩展了 ash 以使其符合 POSIX。最终,他的版本被重命名为 dash,并且有人推动/bin/sh在 Debian 而不是 bash 中制作它。Ubuntu 在 Debian 开始系统地将 bashisms(在#!/bin/sh脚本中使用 bash 特定功能)视为错误之前就开始了。两者都稍后切换(Ubuntu 6.10,Debian 仅在 2009 年(这是 lenny 的目标) 但开关仅在 lenny 释放后进行,即在挤压中))。

使用 dash as 而不是 bash as 的一个主要原因/bin/sh是它的速度要快得多。这对于 Ubuntu 尤其重要,它从一开始就努力缩短启动时间。Dash 也倾向于使用比 bash 更少的内存,这对于在底层程序退出时留下来只是做一些清理的包装脚本有些重要。dash 的另一个好处是它只依赖于 libc(核心系统库),而 bash 还依赖于终端支持库(没有它们它无法启动,甚至无法运行脚本);这意味着 dash 有更好的机会在损坏的系统上继续工作。

在 21 世纪的某个时候,Korn shell 开源,并且出现了 Bourne shell 的开源版本(旧版本,因为开发在几年前就停止了)。但是 dash 和 bash 在 Linux 世界中根深蒂固,无法获得任何认可,尤其是 Bourne shell,因为它今天的价值只是历史性的。Dash 取代了 bash,因为它有明显的好处,但其他竞争者都没有像/bin/sh.

  • @CharlesDuffy Ksh93 在处理复杂的事情时速度更快,但 dash 在启动时间和简单脚本(例如应用程序对 `system`(3) 的所有调用)方面胜过它,这是主要因素。 (3认同)

Ser*_*nyy 26

速度和 POSIX 合规性(换言之,可移植性)是主要因素。请记住,/bin/sh这适用于系统脚本,它可能来自也可能不是来自旧版本的 Ubuntu 和/或其他系统。

当然,bash对于我们用户来说,闪亮的功能很酷,但是当涉及到在必须管理多个不同服务器/系统的环境中运行事物时 - 拥有符合 POSIX 的外壳会产生很大的不同。特别是,如果您是一个新的系统管理员并且继承了许多脚本的环境。

至于为什么没有原始的 Bourne shell,原因很简单——它是 AT&T 贝尔实验室最初拥有的专有产品。

此外,Ubuntu wiki 上实际上对此有明确的解释:

为什么做出这样的改变?切换默认 shell 的主要原因是效率。bash 是一个优秀的全功能 shell,适合交互式使用;事实上,它仍然是默认的登录 shell。但是,与dash相比,它的启动和操作相当大且缓慢。大量 shell 实例作为 Ubuntu 启动过程的一部分启动。Ubuntu 核心开发团队认为,与其单独更改它们中的每一个以在 /bin/dash 下显式运行,但这种更改需要大量的持续维护,并且如果不密切关注可能会倒退,Ubuntu 核心开发团队认为最好只是更改默认外壳。Ubuntu 6.10 中启动速度的改进通常被错误地归因于 Upstart,这是一个很好的平台,可用于 init 系统的未来开发,但在 Ubuntu 6 中。10 主要在 System V 兼容模式下运行,只有很小的行为变化。这些改进实际上主要是由于 /bin/sh 的更改。

这里有一个关于便携性的说明:

Debian 政策手册长期以来一直要求“将 '/bin/sh' 指定为解释器的 shell 脚本必须仅使用 POSIX 功能”;事实上,这个要求早在 Ubuntu 项目开始之前就已经存在。此外,任何希望移植到其他 Unix 系统(如 BSD 或 Solaris)的 shell 脚本都已经满足了这一要求。因此,我们认为此更改对兼容性的影响很小。

https://wiki.ubuntu.com/DashAsBinSh


tho*_*ter 13

在 GNU/Linux 发行版中,“原始/bin/sh”实际上是 Bash。

GNU 想要一个在 GPL 下的类似 Bourne 的 shell,所以这就是为什么他们选择 Bash 作为他们的/bin/sh. 现代 Linux 发行版继承了这一决定,以至于它成为/bin/shBash的事实上的标准。最初的 Bourne shell(“sh”)已经在其他非 Linux Unix 中使用,即使是最近的 Solaris 10,但它从未成为 Linux 发行版的中流砥柱。

/bin/sh从 bash切换到 dash 是 Debian 的决定(由 Ubuntu 继承),主要受速度驱动 - 这是在他们付出巨大努力提高启动速度的时候,并且大部分启动 CPU 时间在运行时保持一致初始化脚本。

Bash 继续用作用户的默认交互/登录 shell,但 Dash 是一种 at/bin/sh并且是为系统脚本(如 init 脚本)执行的一种。

Dash 速度非常快,但也非常接近 POSIX 兼容 - 一种与 Bourne shell 密切相关的标准。所以在某种程度上,通过从 Bash 切换到 Dash,我们正在回到一个与 Bourne 更接近的 shell。