BusyBox 中文文档 下载 App

BusyBox Shell ash 与 hush 的差异和用法

两种 Shell

BusyBox 内置两种 Shell 实现:

Shell全称定位适合场景
ashAlmquist Shell轻量 POSIX sh 实现绝大多数嵌入式系统
hushNoneash 增强版,支持部分 bash 特性需要 bash 语法兼容性

默认开启 ash。hush 需要在 menuconfig 里显式启用(Shells → hush),体积增加约 30KB。

ash 的定位

ash 是 POSIX sh 标准的最小实现,它追求的是:

ash 不支持的功能包括:

ash 支持的标准功能:

hush 增强

hush 在 ash 基础上增加了常用 bash 特性:

如果你的脚本依赖这些特性,开启 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。