什么是/ bin /破折号?

我认为/bin/sh是我select的shell的符号链接。 我一直使用bash ,所以我认为/bin/sh会指向/bin/bash 。 事实certificate,它指向/bin/dash

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

Debian和Ubuntu切换到破折号(iirc),因为一些事情。 首先,Bash多年来变得很大。 实际上,我的Ubuntu 8.04系统上的/bin/bash二进制文件几乎是/bin/dash十倍(!)。 现在,这对于日常的壳用来说并不重要,但是在以下情况下它确实很重要:

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

使用Dash代替Bash进行脚本编写的缺点是,很多人只使用Bash所具有的语法细节,即所谓的Bashisms 。 Bashisms的例子是子string,就像这样:

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

和这个:

 echo ${a#123} 4567890 

另一方面,破折号主要是为了符合POSIX标准(不超过),如果你尝试这样做,会给你一个糟糕的replace错误:

 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 )作为你的shell脚本的解释器并在其中使用Bashisms,这将会很重要。 Debian和Ubuntu有关于Bashisms的很好的wiki页面,以及为什么它们在一般的shell脚本和特别是init脚本中都不好。 因此,您应该有意识地select是否需要/bin/sh/bin/bash作为脚本的解释器。

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

看看这里: https : //wiki.ubuntu.com/DashAsBinSh也许这将有所帮助。

破折号是一个轻量级的bash更换,即时通讯假设你使用Ubuntu几年前改变了它。

它虽然不太好,但我不是。 http://forums.debian.net/viewtopic.php?f=20&t=45116

由于不是所有的shell在运行时都设置$SHELL ,所以你可以通过以下命令find你的当前shell:

 echo $0 

如果它给出了一个错误,那就是csh,否则就是你所调用的argv[0] ,通常是shell,可能带有一个前导连字符,表示它是一个loginshell。

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