Shell 解释器 bash 和 dash 区别
bash
和 dash
都是 Unix/Linux 系统中的 Shell 解释器,但它们在功能、语法和性能上有显著区别。以下是它们的详细对比:
1. 基本区别
特性 | bash (Bourne-Again SHell) | dash (Debian Almquist SHell) |
---|---|---|
来源 | GNU 项目,增强版 sh | 轻量级 sh 兼容实现(源自 ash ) |
功能 | 功能丰富,支持高级编程特性 | 极简,仅 POSIX sh 标准功能 |
速度 | 较慢(功能多,启动开销大) | 极快(适合脚本启动和系统初始化) |
默认 Shell | 多数 Linux 发行版的用户默认 Shell | Ubuntu/Debian 的 /bin/sh 默认 |
用途 | 交互式命令行、复杂脚本 | 系统启动脚本(如 /etc/init.d/* ) |
2. 语法差异
(1) 数组
- bash 支持数组:
arr=("a" "b" "c") echo ${arr[1]} # 输出 "b"
- dash 不支持数组,只能用字符串:
arr="a b c" for item in $arr; doecho "$item" # 逐个输出 a b c done
(2) 条件判断
- bash 支持
[[ ]]
和高级比较:if [[ "$var" == "value" && -f "file.txt" ]]; thenecho "条件成立" fi
- dash 只能用
[ ]
(POSIX 标准):if [ "$var" = "value" ] && [ -f "file.txt" ]; thenecho "条件成立" fi
(3) 函数定义
- bash 支持
function
关键字:function hello() {echo "Hello, bash!" }
- dash 只能用
函数名()
:hello() {echo "Hello, dash!" }
(4) 字符串操作
- bash 支持子字符串、替换等:
str="hello_world" echo ${str:6} # 输出 "world" echo ${str/_/ } # 输出 "hello world"
- dash 需依赖外部命令(如
cut
、sed
):str="hello_world" echo "$str" | cut -d'_' -f2 # 输出 "world"
3. 性能对比
- 启动速度:
dash
的启动时间比bash
快 3-5 倍,适合系统初始化脚本(如 Ubuntu 的/bin/sh
指向dash
以加速启动)。 - 内存占用:
dash
更轻量,适合资源受限的环境(如嵌入式系统)。
4. 兼容性问题
- 脚本错误:
如果脚本用bash
语法编写(如[[ ]]
、数组),但用dash
运行(如sh script.sh
),会报错:Syntax error: "(" unexpected # 数组或函数语法错误
- 解决方案:
- 显式指定解释器:
# 在脚本第一行声明使用 bash #!/bin/bash
- 修改脚本为 POSIX 兼容(避免
bash
特有语法)。
- 显式指定解释器:
5. 如何检查当前 sh
是 bash
还是 dash
?
# 查看 /bin/sh 的链接目标
ls -l /bin/sh
# 输出示例:/bin/sh -> dash(Ubuntu 默认)
6. 总结
场景 | 推荐 Shell | 原因 |
---|---|---|
交互式命令行 | bash | 功能丰富(补全、历史记录等) |
系统启动脚本 | dash | 速度快,节省资源 |
通用脚本(跨平台) | POSIX sh | 兼容性最好(避免 bash 特性) |
复杂脚本(需要数组等) | bash | 支持高级编程特性 |
最佳实践:
- 如果是系统脚本(如
/etc/init.d/*
),用dash
兼容语法。 - 如果是用户脚本,优先用
bash
,并在第一行声明#!/bin/bash
。