Bash和Dash之间的语法差异是什么?

我刚刚意识到,在当前的Ubuntu版本中,/bin/sh不再是一个符号链接指向bash(多年来一直是这样),而是指向dash。我想知道这两个Shell之间实际的语法差异有哪些,并且使用bash编写的shell脚本在dash下是否能正常工作的概率有多大。有人能给我指出一个对这两者之间差异有清晰描述的好资源吗?

这个回答解决了你的问题吗?sh与dash相连的意义是什么? - Nmath
1DashAsBinSh 是一个很好的起点;对于符合POSIX标准的shell,更详尽的参考资料是The Open Group Base Specifications Issue 6: Shell Command Language - steeldriver
@Nmath:那里的回答都没有清楚地说明这些shell之间的区别。我想要的是一份详细列出bash命令或其他语法特性在dash中不支持的清单。 - raj
不知道dash,但至少root用户最初应该有一个对硬件和软件要求非常低的shell。在紧急情况下,一个“臃肿”的shell甚至可能无法启动。 - Gyro Gearloose
关于https://lwn.net/Articles/343924/怎么样? - Rinzwind
不懂连字符,但可以使用fish和大多数bash命令都能正常工作。在组合命令时有一些差异,主要是使用&&符号。可能还有其他一些差异。 - crip659
如果你想要测试一个特定的脚本是否符合sh/POSIX兼容性,可以参考devscripts软件包中提供的checkbashisms脚本。 - steeldriver
1这个回答解决了你的问题吗?#!/bin/sh和#!/bin/bash有什么区别? - KK Patel
@KK Patel,你提供的链接与我的问题完全无关。我显然知道bash和dash是两个不同的shell。我想了解的是它们之间具体的语法差异。 - raj
1个回答

一个简单的经验法则是:如果你的脚本是用bash编写的,不要假设它能在dash中正常工作。详细的差异列表超出了简单问答的范围,但基本上,dash是一个POSIX shell,因此它只实现了POSIX规范中对shell语言的描述
以下是我最常遇到的常见bash特性:
  • [[: dash不支持[[ condition ]]的结构,需要使用[ ]代替。
  • ==:在dash中,要测试两个值是否相等,请使用=,因为不支持==
  • source:用于加载脚本的POSIX命令是.source内置命令是.的别名,所以应始终使用. file而不是source file
  • shopt:这是一个bash内置命令,用于设置某些非标准选项。不被dash支持。
  • $RANDOM:在bash中,每次使用时都会被设置为一个随机数,但在dash中不起作用。

到目前为止,最常见的问题是缺乏[[的支持。您可以在Ubuntu Wiki上找到更全面的列表:https://wiki.ubuntu.com/DashAsBinSh


作为补充,'function' 是在 bash 中声明函数的关键字,但在 dash 中不可用。请查看此处的描述:https://stackoverflow.com/questions/7917018/what-is-the-function-keyword-used-in-some-bash-scripts - Kevin Chan
信不信由你,直到今天每次我想找/bin/sh支持的语法时,我都在谷歌搜索Bourne Shell而不是Dash。 - Sridhar Sarnobat