我刚刚意识到,在当前的 Ubuntu 版本中,/bin/sh
不再有符号链接到bash
(多年来一直如此),而是链接到。我想知道这两个 shell 之间的实际语法差异是什么,以及考虑到这一点而编写的 shell 脚本在 下无法运行的dash
可能性有多大。有人能给我指出这两者之间差异的清晰描述吗?bash
dash
答案1
一个简单的经验法则是:如果你的脚本是用 bash 编写的,不要假设它会在 dash 中工作。完整的差异列表超出了简单问答的范围,但本质上,它dash
是一个 POSIX shell,因此它实现了shell 语言的 POSIX 规范 并且仅此而已。
以下是我最常遇到的常见攻击性言论:
[[
:[[ condition ]]
不支持该构造dash
,因此您需要使用[ ]
。==
:测试两个值是否相等,由于不支持,因此请使用=
破折号。==
source
:获取脚本的 POSIX 命令是.
。source
内置命令是标准的 bash 别名.
,因此始终使用. file
而不是source file
。shopt
:这是 bash 内置命令,用于设置某些非标准选项。不支持dash
。$RANDOM
:每次使用时都会将其设置为一个随机数bash
,但在中不起作用dash
。
到目前为止,最常见的问题是缺乏[[
支持。你可以在 Ubuntu Wiki 上找到更全面的列表:https://wiki.ubuntu.com/DashAsBinSh