BusyBox Shell ash 与 hush 的差异和用法
两种 Shell
BusyBox 内置两种 Shell 实现:
| Shell | 全称 | 定位 | 适合场景 |
|---|---|---|---|
| ash | Almquist Shell | 轻量 POSIX sh 实现 | 绝大多数嵌入式系统 |
| hush | None | ash 增强版,支持部分 bash 特性 | 需要 bash 语法兼容性 |
默认开启 ash。hush 需要在 menuconfig 里显式启用(Shells → hush),体积增加约 30KB。
ash 的定位
ash 是 POSIX sh 标准的最小实现,它追求的是:
- 严格遵循 POSIX.2 sh 标准
- 极小体积(编译进 BusyBox 约 60KB)
- 快速启动(适合嵌入式设备频繁 fork 新 shell 的场景)
ash 不支持的功能包括:
[[ ]]双括号条件判断(用[ ]替代)- 数组和关联数组
- 大多数 bash 专有内建命令
${BASH_SOURCE}、${FUNCNAME}等 bash 变量
ash 支持的标准功能:
- 标准流程控制:
if、case、for、while、until - 函数定义:
func() { ... } - 标准变量展开:
$var、${var-default}、${var:-default}、${#var} - 管道、重定向、命令替换
- 内建命令:
cd、echo、read、export、unset、trap、ulimit
hush 增强
hush 在 ash 基础上增加了常用 bash 特性:
- 支持
[[ ]]双括号和(( ))算术判断 - 支持数组(
arr[0]、${arr[@]}) - 支持
select循环 - 字符串展开增强(
${var/pattern/replacement}) - 更丰富的内建命令
如果你的脚本依赖这些特性,开启 hush 会省去很多兼容性问题。但 hush 体积更大,而且严格来说仍然不是完整的 bash——如果你需要完整 bash,得额外编译安装 bash 本身(约 1MB)。
脚本编写规范
在 BusyBox 环境下写脚本的实用准则:
# 第一行必须是 sh 而不是 bash
#!/bin/sh
# 或者:#!/bin/ash
# 变量赋值等号两边不能有空格
NAME="value"
# 错误:NAME = "value"
# 条件判断用 [ ] 而不是 [[ ]]
if [ "$VALUE" -gt 10 ]; then
echo "too big"
fi
# 字符串比较用 = ,!= 不被 POSIX sh 支持(ash 部分支持但不推荐)
if [ "$STATUS" = "ok" ]; then
echo "all good"
fi
# 不要用 echo 输出多行——某些 ash 版本对 \n 的处理有差异
# 推荐用 printf
printf "line1\nline2\n"
快速验证
在 BusyBox 上快速检查一个脚本能不能跑:
# 模拟 POSIX sh 模式(即使系统默认是 bash)
busybox ash -x your_script.sh
# -x 会打印每一行执行的命令,方便调试
如果脚本报 syntax error: bad substitution 或 [[: not found,说明用了 ash 不支持的 bash 语法,需要改写或换 hush。