什么是 /bin/dash?

什么是 /bin/dash?

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

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

答案1

Debian 和 Ubuntu 改用 dash(如果我没记错的话)是因为以下几个原因。首先,Bash 多年来变得越来越大。事实上,/bin/bash我的 Ubuntu 8.04 系统上的二进制文件几乎是 的十倍(!)/bin/dash。现在,这对于日常 shell 使用来说并不重要,但在以下情况下确实很重要:

  • Dash 更小,因此加载速度更快,这对 init 脚本来说是个福音。如果您需要启动很多脚本,那么每次都加载 Dash 而不是 Bash 可以大大加快速度。
  • 由于 Dash 体积较小,Debian 和 Ubuntu 能够削减其 initrd 的很大一部分大小,从而为其他内容留下更多空间(并且再次加快速度)。

使用 Dash 而不是 Bash 编写脚本的缺点是,很多人使用只有 Bash 才具有的语法细节,即所谓的巴什主义。Bashism 的示例是子字符串,如下所示:

echo $SHELL
/bin/bash
a=1234567890
echo ${a}
1234567890
echo ${a:3}
4567890
echo ${a:3:1}
4

和这个:

echo ${a#123}
4567890

另一方面,Dash 主要致力于符合 POSIX 标准(仅此而已),它将为您提供糟糕的替代如果你尝试这样做,则会出错:

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

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

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

答案2

请看这里:https://wiki.ubuntu.com/DashAsBinSh也许它会有帮助。

答案3

dash 是一个轻量级的 bash 替代品,我假设你使用的 ubuntu 几年前就改用了 dash。

但在我看来,它并不是特别好。 http://forums.debian.net/viewtopic.php?f=20&t=45116

答案4

由于运行时并非所有 shell 都已设置$SHELL,因此可以使用以下命令找出当前 shell:

echo $0

如果它给出错误,则是 csh,否则就是argv[0]您被调用的,通常是 shell,可能带有前导-连字符,以表明它是一个登录 shell。

这不是保证,因为它argv[0]处于调用过程的控制之下,但实际上它是最可靠的方法。

相关内容