当前位置: 首页>>技术教程>>正文


bash – sh 与 dash 链接有什么意义?

,

问题描述

我想知道 sh 符号链接到 dash 的意义是什么?我知道 dash 应该比 bash 更快,但我不确定为什么原始的 sh shell 不存在于 sh 中。

或者如果有的话为什么 sh 没有链接到 bash

最佳方法

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

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

1979 年,在 Unix V7 中,汤普森炮弹被 Bourne shell 替换为 /bin/sh。第一个版本已经有 many of the features ,现在出现在 dash 中,后续版本引入了 many more 。几年后,Korn shell 出现,其功能集不断增长;许多 Unix 变体以 ksh 名称安装它。

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

Bourne shell 和 Korn shell 直到最近才开源,因此当 Linux 世界在 20 世纪 90 年代中期开始形成时,它们还无法使用。 /bin/sh 必须是其他东西。大多数 Linux 发行版都选择 bash ,它是 GNU project 的一个 shell,在脚本功能方面往往介于 Bourne 和 Korn 之间,并且在交互使用方面比两者都好得多)。唯一可行的替代方案是 pdksh (\u201c公共域 Korn shell\u201d),一个免费的(现已停产,但作为 mksh ,即 actively developed 继续存在),但我不记得使用 pdksh 作为 /bin/sh 的 Linux 发行版,我不记得我不知道为什么,我猜是因为 Linux 发行版始终是 GNU/Linux 发行版,基本上发布了确实存在 GNU 版本的任何工具的 GNU 版本。

还有几个名为 \u201cash\u201d 的 sh 开源实现,最著名的是 Almquist shell ,但它们非常不完整,缺乏人们想要使用的一些 POSIX 功能。一位 Debian 维护者 Herbert Xu 程序员扩展了 ash,使其符合 POSIX 标准。最终他的版本被重命名为 dash,并且有人推动在 Debian 中将其改为 /bin/sh 而不是 bash。 Ubuntu 在 Debian 开始系统地将 bashism(在 #!/bin/sh 脚本中使用 bash-specific 功能)视为 bugs 之前就开始了。两者后来都切换了( Ubuntu 6.10 ,Debian 仅在 2009 年( it was a goal for lenny 但切换是在 lenny 版本之后才进行的,即在挤压中))。

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

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

次佳方法

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

当然,bash 的闪亮功能对于我们用户来说使用起来很酷,但是当涉及到在必须管理多个不同服务器/系统的环境中运行时 – 拥有 POSIX 兼容的 shell 会带来很大的不同。特别是,如果您是新的系统管理员并且继承了具有许多脚本的环境。

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

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

\\n

Why was this change made?\\n The major reason to switch the default shell was efficiency. bash is an excellent full-featured shell appropriate for interactive use; indeed, it is still the default login shell. However, it is rather large and slow to start up and operate by comparison with dash. A large number of shell instances are started as part of the Ubuntu boot process. Rather than change each of them individually to run explicitly under /bin/dash, a change which would require significant ongoing maintenance and which would be liable to regress if not paid close attention, the Ubuntu core development team felt that it was best simply to change the default shell. The boot speed improvements in Ubuntu 6.10 were often incorrectly attributed to Upstart, which is a fine platform for future development of the init system but in Ubuntu 6.10 was primarily running in System V compatibility mode with only small behavioural changes. These improvements were in fact largely due to the changed /bin/sh.

\\n

这是关于可移植性的注释:

\\n

The Debian policy manual has long mandated that “shell scripts specifying ‘/bin/sh’ as interpreter must only use POSIX features”; in fact, this requirement has been in place since well before the inception of the Ubuntu project. Furthermore, any shell scripts that expected to be portable to other Unix systems, such as the BSDs or Solaris, already honoured this requirement. Thus, we felt that the compatibility impact of this change would be minimal.

\\n

参见https://wiki.ubuntu.com/DashAsBinSh

第三种方法

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

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

/bin/sh 从 bash 切换到 dash 是 Debian 的决定(由 Ubuntu 继承),主要是出于速度的考虑 – 它是在他们为提高启动速度付出巨大努力的时候做出的,并且当时的大部分启动 CPU 时间与运行初始化脚本。

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

Dash 非常快,但也非常接近 POSIX-compatible – 一个与 Bourne shell 紧密结合的标准。因此,在某种程度上,通过从 Bash 切换到 Dash,我们正在回到与 Bourne 更加一致的 shell。

第四种方法

我认为出于兼容性原因,/bin/sh 链接到 /bin/dash。许多脚本只是以

#!/bin/sh

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

更改从 bash 更改为 dash,因为根据 https://wiki.ubuntu.com/DashAsBinSh

\\n

The major reason to switch the default shell was efficiency. bash is an excellent full-featured shell appropriate for interactive use; indeed, it is still the default login shell. However, it is rather large and slow to start up and operate by comparison with dash. A large number of shell instances are started as part of the Ubuntu boot process. Rather than change each of them individually to run explicitly under /bin/dash, a change which would require significant ongoing maintenance and which would be liable to regress if not paid close attention, the Ubuntu core development team felt that it was best simply to change the default shell.

\\n

sh 未链接到 bash ,因为

\\n

The Debian policy manual has long mandated that “shell scripts specifying ‘/bin/sh’ as interpreter must only use POSIX features”

\\n

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

\\n

If the problems are more widespread and you want to change the default system shell back, then you can instruct the package management system to stop installing dash as /bin/sh:

\\n

sudo dpkg-reconfigure dash

dash 提供了一些 bash 不提供的功能,例如:

\\n

there is even an outside chance that there are a few scripts that now depend on some feature of dash that bash does not provide!

\\n

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/13791.html,未经允许,请勿转载。