我以为/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]
处于调用过程的控制之下,但实际上它是最可靠的方法。