对于许多 Linux 用户,尤其是开发者和系统管理员来说,Shell 是与操作系统交互的核心工具。在 Ubuntu 及其上游 Debian 系统中,默认的系统 Shell(/bin/sh)指向的是 dash(Debian Almquist Shell),而不是更为人熟知的 bash(Bourne Again Shell)。

这种默认设置虽然在性能上有一定优势,但在某些情况下会导致脚本的兼容性问题。本文将解释 Ubuntu 为什么选择 dash 作为默认 Shell,以及 在什么场景下、如何安全地切换回 bash


1. 为什么 Ubuntu 默认使用 dash?

Ubuntu 将 /bin/sh 链接到 dash 而非 bash,主要出于以下两个考虑:

1.1 更高的执行效率

dash 是一个轻量级 Shell,体积小、启动快,解析和执行脚本的速度比 bash 更快。 在系统启动过程中,需要运行大量初始化脚本,使用 dash 可以显著缩短启动时间,提升系统整体响应速度。

1.2 严格遵循 POSIX 标准

dash 严格遵循 POSIX(Portable Operating System Interface)标准。 如果一个脚本是按 POSIX 标准编写的,它就能在 dash 下完美运行。 这种严格性可以促使开发者编写更具可移植性、不依赖特定 Shell 扩展(如 bash 特有语法)的脚本。

小结 对于系统级初始化脚本而言,dash 是一个高效且标准化的选择。


2. 为什么要切换回 bash?

尽管 dash 在性能和标准化方面有优势,但在很多实际使用场景中,开发者和用户可能更需要 bash。 核心原因: 兼容性问题。

许多脚本作者在编写时会默认使用 bash 特性,这些扩展语法在 dash 中无法识别,直接导致运行错误。 常见的 bash 特性(“bashisms”)包括:

  • [[ ... ]] 条件判断
  • (( ... )) 算术表达式
  • source 命令(dash 中需用 .
  • function 关键字
  • 数组(Array)操作
  • {...} 字符串扩展

如果从网上下载了一个脚本,或运行其他发行版(如 CentOS,/bin/sh 默认是 bash)下编写的安装脚本,在 Ubuntu 上就可能遇到类似的错误:

[[: not found
source: not found

这种情况下,将默认 /bin/sh 切换回 bash 是最简单直接的解决方案。


3. 如何将默认 Shell 从 dash 切换到 bash

Ubuntu 提供了安全的配置工具来完成切换。

3.1 检查当前默认 Shell

ls -l /bin/sh

在默认的 Ubuntu 系统上,你会看到类似输出:

lrwxrwxrwx 1 root root 4 Mar 28 09:00 /bin/sh -> dash

这表示 /bin/sh 是指向 dash 的符号链接。


3.2 使用 dpkg-reconfigure 切换(推荐方法)

运行以下命令:

sudo dpkg-reconfigure dash

终端会弹出交互式提示:

Use dash as the default system shell (/bin/sh)?

此时:

  • 选择 No(否)/bin/sh 将指向 bash
  • 选择 Yes(是)/bin/sh 将指回 dash(恢复默认)

3.3 验证更改

ls -l /bin/sh

切换成功后,你会看到类似输出:

lrwxrwxrwx 1 root root 4 Apr 25 10:00 /bin/sh -> bash

此时,之前在 dash 下因语法不兼容而报错的脚本,就可以在 bash 环境中正常运行了。


4. 如何切回 dash?

如果需要恢复默认设置,只需再次运行:

sudo dpkg-reconfigure dash

这次选择 Yes(是) 即可。


5. 总结

  • dash 的优势:轻量、启动快、POSIX 兼容,适合系统初始化脚本。

  • bash 的优势:功能更丰富,兼容大多数用户脚本和第三方安装程序。

  • 建议

    • 桌面用户、开发者以及需要运行大量第三方脚本时,推荐将 /bin/sh 切换到 bash,以获得更好的兼容性。
    • 如果追求系统启动速度并运行严格遵循 POSIX 的脚本,可保留 dash。

使用 sudo dpkg-reconfigure dash 命令,可以在两者之间安全切换,做到按需选择、互不影响。