什么是/ bin / dash?


27

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

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


1
@wzzrd,这是特定于Linux的问题吗?
aioobe

1
叹气,我不能赞成所有这些好答案,因为我需要15次代表。我感到有残障,因为我在stackoverflow上有18k:-/
aioobe 2010年

4
mmm dash .. / bin / crash(对于gdb粉丝),/ bin / slash(紧缩计划),/ bin / mash(在韩国困难时期),/ bin / sash(对于啦啦队长),/ bin / thrash怎么样? (硬碟上的硬碟),/ bin / flash(但只有在加密资料时才可使用),/ bin / stash(祝您日后找到它),/ bin / cash(您总是物有所值),/ bin / pash(增强PC),/ bin / gash(aaargggh!)。
PP。

2
@PP-我为金属音乐迷阅读/ bin / thrash,为80年代摇滚乐队首席吉他手的迷阅读/ bin / slash ... :-P
gWaldo 2010年

1
echo $SHELL打印的原因/bin/bash是因为该变量是为登录时启动的默认外壳(而不是当前运行的外壳)设置的。从Bash提示符启动ksh或zsh,echo $SHELL仍然会说/bin/bash。用ps看什么当前正在运行。
暂停,直到另行通知。

Answers:


43

由于一些原因,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上运行的可能性。


1
如果您使用Bashisms编写脚本,请指定/bin/bash; 许多非Linux系统都有实际的shshell,甚至与它们都不兼容bash
克里斯·S

echo ${a#123}不是Bashism,它是POSIX参数扩展规范的一部分。pubs.opengroup.org/onlinepubs/009695399/utilities/… 您只是没有获得更高级的sed风格的Bash风格,posix的风格是子字符串风格+简单的扩展字符。意思是,POSIX也允许echo ${a#*6}
JM Becker



0

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

echo $0

如果给出错误,argv[0]则为csh,否则为调用您的对象,通常是shell(可能带有前导-连字符)来指示它是登录shell。

由于这是在调用过程的控制之下,因此无法保证argv[0]但是实际上这是最可靠的方法。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.