什么是/bin/dash?

aio*_*obe 29 linux shell bash

我认为这/bin/sh是我选择的外壳的符号链接。我一直使用bash,所以我认为这/bin/sh会指向/bin/bash。但事实证明,它指向/bin/dash

它变得更有趣。我开始dash并执行echo $SHELL并打印/bin/bash(所以它们基本上相同?)。但是, 的手册页与 的手册页dash完全不同bash(所以它们一样?)。

wzz*_*zrd 46

由于一些原因,Debian 和 Ubuntu 改用了 dash (iirc)。首先,多年来,Bash 变得越来越大。事实上,/bin/bash我的 Ubuntu 8.04 系统上的二进制文件几乎是/bin/dash. 现在,这对于日常 shell 使用来说并不重要,但在以下情况下确实很重要:

  • Dash 更小,因此加载速度更快,这对 init-scripts 来说是一个福音。如果你必须启动很多,每次加载 Dash 而不是 Bash,会大大加快速度。
  • 由于 Dash 的尺寸较小,Debian 和 Ubuntu 能够削减其 initrd 的很大一部分,为其他东西留出更多空间(再次加快速度)。

使用 Dash 而不是 Bash 进行脚本编写的缺点是,很多人使用 Bash独有的语法细节,即所谓的Bashisms。Bashisms 的例子是子字符串,像这样:

echo $SHELL
/bin/bash
a=1234567890
echo ${a}
1234567890
echo ${a:3}
4567890
echo ${a:3:1}
4
Run Code Online (Sandbox Code Playgroud)

和这个:

echo ${a#123}
4567890
Run Code Online (Sandbox Code Playgroud)

另一方面,Dash 主要旨在符合 POSIX 标准(仅此而已),如果您尝试这样做,会给您一个Bad substition错误:

echo $SHELL
/bin/dash 
# actually, it will read /bin/bash above, because if you just run dash
# it will not set the $SHELL variable :)
a=1234567890
echo ${a}
1234567890
echo ${a:3}
dash: Bad substitution
Run Code Online (Sandbox Code Playgroud)

如果您使用/bin/sh(因此dash)作为您的 shellscript 的解释器并在其中使用 Bashism,这将很重要。Debian 和 Ubuntu 有很好的关于 Bashisms 的 wiki 页面,以及为什么它们在一般的 shellscripts 和特别是 init-scripts 中都很糟糕。因此,您应该有意识地选择是否需要/bin/sh/bin/bash作为脚本的解释器。

Dash 不应用作系统上的默认 shell。只需使用 Bash 即可。为了脚本的可移植性,您可以使用 Dash 作为解释器来增加脚本在其他 Linux 版本和 Unix 上运行的几率。