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