🇯🇵 日本語 | 🇺🇸 English | 🇪🇸 Español | 🇵🇹 Português | 🇹🇭 ไทย | 🇨🇳 中文

Dash 是什么?轻量级、高速 Shell 的特点与用途解说

在使用 Linux 或 macOS 时,您可能经常听到“shell”或“Bash”这些词。但是,您听说过名为 Dash 的 shell 吗?实际上,Dash 是一个在幕后默默工作的“无名英雄”,尤其是在像 Ubuntu 这样的基于 Debian 的 Linux 发行版中。

本文专为那些“听说过但不太了解”的 Web 创造者而写,我们将通过只需复制粘贴即可运行的示例代码,通俗易懂地解释 Dash 究竟是什么、它有什么特点、与 Bash 有何不同以及具体的使用方法。读完本文,您将能够理解 Dash 的魅力并熟练地使用它!


Dash shell 是什么?

Dash 是“Debian Almquist shell”的缩写,顾名思义,它是由 Debian 项目开发的 shell。它最初是从 NetBSD 中使用的 Almquist Shell (ash) 移植到 Linux 的。

其最大的特点是轻量和高速。我们平时在终端中随手使用的“Bash”,可以说是一个功能丰富的“豪华版 shell”,拥有命令历史补全和各种便利的独有功能。相比之下,Dash 通过将功能限制在 POSIX(可移植操作系统接口标准)规定的最小范围内,实现了惊人的轻快性。

特别是在 Ubuntu 和 Debian 中,系统的默认 shell /bin/sh 实际上是指向 Dash 的一个符号链接(类似于快捷方式)。这使得系统启动脚本等能够高速执行,为提升整个操作系统的性能做出了贡献。


Dash 的主要优点(特点)

让我们更具体地看看 Dash 的厉害之处。

  • 🚀 执行速度快: 因为功能简单,程序启动和脚本解析的速度非常快。特别是在执行数千次循环或大量小脚本时,与 Bash 的速度差异尤为明显。
  • 内存占用少: 由于其轻量级特性,可以抑制内存消耗。这在内存有限的嵌入式系统或需要同时运行大量容器的服务器环境中是一个巨大的优势。
  • 遵循 POSIX 标准: Dash 非常严格地遵循 POSIX 标准。这意味着“为 Dash 编写的 shell 脚本很可能也能在其他遵循 POSIX 的 shell(例如 macOS 的 zsh)上正确运行”。当您希望提高脚本的可移植性和兼容性时,Dash 是一个理想的测试环境。

马上体验!亲手尝试 Dash

百闻不如一见。让我们实际操作一下 Dash,亲身体验它的特点吧!

1. 确认当前的 shell

首先,让我们确认一下您当前正在使用的默认 shell 是什么。打开终端并执行以下命令。在大多数情况下,您会看到“bash”或“zsh”。

$ ps -p $$
  PID TTY          TIME CMD
 5678 pts/0    00:00:00 bash

2. 启动 Dash

那么,让我们启动 Dash 吧。只需在命令行中输入 `dash` 并按 Enter 键即可。当提示符(等待输入的符号)变为 `$` 时,您就进入了 Dash 的世界。

$ dash
$ 

要返回原来的 shell(如 Bash),请输入 `exit`。


3. [体验] 与 Bash 的速度比较

让我们通过一个简单的循环处理来比较一下 Dash 有多快。在这里,我们将分别用 Bash 和 Dash 执行一个简单计数从 1 到 100,000 的脚本。使用 time 命令可以测量处理所花费的时间。

首先,我们用 Bash 执行。

$ time bash -c 'i=0; while [ $i -lt 100000 ]; do i=$((i+1)); done'

real    0m1.523s
user    0m1.518s
sys     0m0.005s

※执行时间因环境而异。


接下来,让我们用 Dash 执行完全相同的处理。

$ time dash -c 'i=0; while [ $i -lt 100000 ]; do i=$((i+1)); done'

real    0m0.384s
user    0m0.381s
sys     0m0.003s

怎么样?在我的环境中,Bash 大约需要 1.5 秒的处理,而 Dash 只用了不到 0.4 秒就完成了。速度差距接近 4 倍! 像这样,在重复执行简单脚本时,Dash 的高速性展现了巨大的效果。


注意事项:Bash 中有而 Dash 中没有的功能

Dash 虽然速度快,但另一方面,它不支持一些在 Bash 中理所当然可以使用的便利功能。这被称为“Bashism”(Bash 特有语法)。如果不了解这一点,用 Bash 的语法编写脚本,在 Dash 中执行时就会出错,需要注意。

示例 1:无法使用数组

在 Bash 中,您可以使用 `()` 轻松定义数组,但 Dash 没有数组的概念。

在 Bash 中(正常工作)

$ bash -c 'fruits=("apple" "banana" "orange"); echo ${fruits[1]}'
banana

在 Dash 中(会报错)

$ dash -c 'fruits=("apple" "banana" "orange"); echo ${fruits[1]}'
dash: 1: Syntax error: "(" unexpected

示例 2:无法使用扩展测试命令 `[[ ... ]]`

Bash 的 `[[ ... ]]` 功能强大,可用于字符串匹配和正则表达式,但它不是 POSIX 标准。在 Dash 中,您需要使用传统的 `[ ... ]`。

在 Bash 中(正常工作)

$ bash -c '[[ "hello" == "hello" ]] && echo "Yes"'
Yes

在 Dash 中(会报错)

$ dash -c '[[ "hello" == "hello" ]] && echo "Yes"'
dash: 1: [[: not found

在 Dash 中的正确写法

要在 Dash 中完成同样的操作,请使用 `[`,并且等号只用一个 `=`。

$ dash -c '[ "hello" = "hello" ] && echo "Yes"'
Yes

示例 3:无法使用花括号展开 `{...}`

在生成连续文件名等场景中非常方便的花括号展开也是 Bash 的功能。

在 Bash 中(正常工作)

$ bash -c 'echo file-{1..3}.txt'
file-1.txt file-2.txt file-3.txt

在 Dash 中(会原样显示)

$ dash -c 'echo file-{1..3}.txt'
file-{1..3}.txt

Dash 的主要用途

那么,考虑到这些特性,Dash 通常在哪些场景中使用呢?

  • 系统启动脚本: 这是最常见的用途。它能高速处理操作系统启动时执行的大量脚本,从而缩短启动时间。
  • 执行 shell 脚本: 对于要求处理速度的脚本(例如:分析大量日志文件、简单的批处理等),用 Dash 编写可以提高性能。
  • 资源受限的环境: 在物联网设备、嵌入式系统、Docker 容器等内存和 CPU 性能有限的环境中,轻量级的 Dash 备受青睐。
  • 脚本兼容性检查: 检查您编写的 shell 脚本是否依赖于 Bash 的特有功能(即是否符合 POSIX 标准),一个好方法是尝试用 `dash myscript.sh` 来执行它。

另一方面,作为交互式 shell(我们平时在终端中使用的 shell),Dash 并不太适合。 与 Bash 相比,它在命令补全、历史搜索、别名等便利功能方面较弱,可能会降低日常工作效率。


总结:明智地分别使用 Bash 和 Dash

在本文中,我们解说了轻量级、高速的 shell "Dash"。

  • Dash 是一个通过精简功能来追求轻量和高速的 shell。它擅长处理系统后台任务和高速执行脚本。
  • Bash 是一个充满便利功能的多功能 shell。它擅长我们日常输入命令时的交互式使用。

理解每个 shell 的长处和短处非常重要。不建议仅仅因为“它快”就轻易地将默认登录 shell 从 Bash 更改为 Dash。

记住 Dash 是一个能加速系统启动的“幕后功臣”,也是一个能让你的 shell 脚本更快一步的“秘密武器”,这会为你的技术工具箱增添一项新技能。请务必根据不同场景,恰当地利用 Dash!