与短划线相关联的重点是什么?

我想知道什么是与dash符号是什么? 我明白dash应该比bash快,但我不确定为什么原始的sh shell不存在于sh

或者,如果有什么原因与bash无关?

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

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

1979年,在Unix V7中 ,Thompson shell被Bourne shell替换为/bin/sh 。 第一个版本已经拥有了今天破折号中的许多function ,后续版本也引入了更多function 。 几年后, Kornshell进入了现场,function越来越多; 许多Unix变种以名称ksh安装它。

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

直到最近,Bourne shell和Korn shell都不是开源的,所以当Linux世界在20世纪90年代中期开始形成时,它们就无法使用。 /bin/sh必须是别的东西。 大多数Linux发行版都使用bash ,这是GNU项目中的shell,在脚本function方面往往介于Bourne和Korn之间,并且比交互式使用要好得多。 唯一可行的替代方案是pdksh(“公共领域Korn shell”),一个免费的(现已停产,但生活在mksh ,这是积极开发的 ),但我不记得使用pdksh作为/bin/sh的Linux发行版,我不知道为什么,我想因为Linux发行版总是GNU / Linux发行版,基本上都是GNU版本存在的GNU版本的GNU版本。

还有一些名为“ash”的开源实现,最着名的是Almquist shell ,但它们非常不完整,缺少一些人们想要使用的POSIXfunction。 作为Debian维护者的程序员Herbert Xu扩展了灰,使其符合POSIX标准。 最终他的版本被重命名为dash,并且有一些推动使用Debian而不是bash来/bin/sh 。 在Debian开始系统地处理bashisms(在#!/bin/sh脚本中使用bash特定function)作为bug之前,Ubuntu就开始了。 两者都换了之后( Ubuntu 6.10 ,Debian仅在2009年( 这是lenny的目标,但是转换只是在lenny发布之后,即在挤压中))。

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

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

速度和POSIX合规性(换句话说,便携性)是主要因素。 请记住, /bin/sh适用于系统脚本,这些脚本可能来自旧版本的Ubuntu和/或其他系统。

当然, bashshinyfunction对于我们的用户来说很酷,但是当涉及到在必须管理多个不同服务器/系统的环境中运行时 – 拥有POSIX兼容的shell会产生很大的不同。 特别是,如果您是一个新的系统管理员和具有许多脚本的inheritance环境。

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

另外,Ubuntu wiki实际上有一个明确的解释:

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

以下是关于可移植性的说明:

Debian政策手册长期以来要求“指定’/ bin / sh’作为解释器的shell脚本必须只使用POSIXfunction”; 实际上,这个要求自Ubuntu项目开始之前就已经存在。 此外,任何期望可移植到其他Unix系统(例如BSD或Solaris)的shell脚本已经满足了这一要求。 因此,我们认为这种变化的兼容性影响很小。

请参阅https://wiki.ubuntu.com/DashAsBinSh

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

GNU想要一个类似Bourne的shell,这是因为他们选择Bash作为他们的/bin/sh ,而不是Bourne,它不是GPL许可的。 现代Linux发行版inheritance了这一决定,以至于它成为/bin/sh成为Bash的事实标准。 最初的Bourne shell(“sh”)已经在其他非Linux Unix中使用,即使是最近的Solaris 10,但它从未成为Linux发行版的支柱。

从bash到dash的切换/bin/sh是Debian的决定(由Ubuntuinheritance)主要受速度的影响 – 它是在他们付出巨大努力来提高启动速度和大部分启动CPU时间的时候出现的。运行init脚本的时间一致。

Bash继续被用作用户的默认交互/登录shell,但Dash是/bin/sh的一个,也是为init脚本等系统脚本执行的。

Dash非常快,但也非常接近POSIX兼容 – 与Bourne shell紧密结合的标准。 所以在某种程度上,通过从Bash切换到Dash,我们将回到与Bourne更紧密对齐的shell。

/bin/sh链接到/bin/dash ,我认为是兼容性原因。 许多脚本只是从一开始

 #!/bin/sh 

因此,如果/bin/sh根本不存在,那么通过移动到dash并且不进行符号链接,许多脚本将无法正常运行(或根本不运行)。

根据https://wiki.ubuntu.com/DashAsBinSh ,更改是从bashdash进行的:

切换默认shell的主要原因是效率。 bash是一款出色的全functionshell,适合互动使用; 实际上,它仍然是默认的登录shell。 然而,与破折号相比,启动和操作相当大且速度慢。 作为Ubuntu启动过程的一部分,启动了大量shell实例。 Ubuntu核心开发团队认为最好只需改变,而不是单独更改它们中的每一个以明确地在/ bin / dash下运行,这需要进行大量的持续维护,如果不加以密切关注则可能会退化。默认的shell。

shbash无关,因为

Debian政策手册长期以来要求“指定’/ bin / sh’作为解释器的shell脚本必须只使用POSIXfunction”

如果你想使用bash作为/bin/sh

如果问题更加普遍并且您想要更改默认系统shell,那么您可以指示包管理系统停止将dash安装为/ bin / sh:

 sudo dpkg-reconfigure dash 

有一些function, dash提供bash不,如:

甚至有一个外部机会,有一些脚本现在依赖于bash不提供的破折号的某些function!