由于一些原因,Debian和Ubuntu切换到破折号(iirc)。首先,多年来Bash变得越来越大。实际上,/bin/bash
我的Ubuntu 8.04系统上的二进制文件几乎是的十倍(!)/bin/dash
。现在,对于日常shell使用而言,这无关紧要,但在以下情况下确实很重要:
- Dash小得多,因此加载速度更快,这对init脚本是一个福音。如果您必须开始大量操作,则每次都加载Dash而不是Bash可以大大加快操作速度。
- 由于Dash的大小较小,Debian和Ubuntu可以削减initrd大小的很大一部分,从而为其他内容留出更多空间(再次加快速度)。
使用Dash代替Bash进行脚本编写的缺点是,许多人仅使用Bash拥有的语法技巧,即所谓的Bashisms。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(仅此而已),如果您尝试执行以下操作,将给您带来Bad Bad替换错误:
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
(因此dash
)作为shellscript的解释器并在其中使用Bashism,这将很重要。Debian和Ubuntu在Wiki页面上介绍了Bashisms,以及为什么它们在shell脚本(尤其是init脚本)方面表现不佳。因此,您应该自觉选择是需要脚本/bin/sh
还是/bin/bash
解释器。
不应将Dash用作系统上的默认Shell。只需使用Bash即可。为了使脚本具有可移植性,可以使用Dash作为解释器,以增加脚本在其他Linux版本和Unixes上运行的可能性。