兼容总览:83/83 是什么意思
「兼容 bash」是一句谁都会说的话。niubash 的版本是测出来的,不是宣称的: 拿 GNU Bash 自己的 83 套上游测试语料,在真机 Windows 上做 true-baseline 双向差分, 结果是 83/83 通过、82 套输出逐字节一致,唯一残差被逐字节证明是 GNU Bash 自身的竞态。这一页解释这些数字的确切含义与测量方法。
什么是 true-baseline 差分
兼容性测量最容易掺水的环节是「基线」。跑上游测试却不固定环境、或让脚本桩替代
真实工具,测出的通过率毫无意义。rubash 的台账(2026-10-12 在 master
764b9dde 全量复跑)记录了基线纪律:不使用上游脚本桩、由 niu
挂载真实的 /bin/sh、每套件独立 TMPDIR、前台超时控制;
同机同环境先跑纯基线失败集,双向 comm 为空才放行——即 GNU
失败而引擎通过、或引擎失败而 GNU 通过的方向性差异都要归零。环境绑定差异
(NTFS 属性位、locale、宿主工具输出、/dev/tty 等)逐项审计后才计为零。
语义判定的一手依据是仓内 vendored 的 GNU bash-5.3 源码:每个行为主张给出
file:line 坐标;WSL 里的 GNU 5.3.0 只做行为验证。GPL 代码零拷贝,
判定纪律成文于 PROVENANCE 文档。
83/83 与 82 套 byte-identical 的语义
| 指标 | 数值 | 含义 |
|---|---|---|
| PASS | 83/83(100%) | GNU Bash 5.3 上游测试语料 83 个套件全部通过,含 nameref。 |
| Byte-identical | 82 套(0 diff) | 输出与 GNU 逐字节相同——不是「语义等价」,是字节级 diff 为空。 |
| nameref 残差 | 1 行 | coproc 后 declare -r RO_PID 可见性差异,被证明是 GNU 5.3.0 自己的 coproc 回收竞态(见下)。 |
| 环境性差异 | 9 套计零 | glob/extglob/read/coproc 等套件的差异项均为 NTFS、locale、信号表等环境绑定因素,A/B 双 commit 逐套一致后审计计零。 |
那一行 nameref 残差值得单独讲:在同一套 harness 文件系统上,GNU Bash 对自己就能在 59/60 与 1/60 之间翻转这一行的输出;而在 ext4 上 GNU 60/60 稳定,其输出与 rubash 逐字节一致(stdout 与 stderr 皆是)。结论: 残差属于 GNU 自身的 reap 时序竞态,不是引擎缺陷——归因论证以逐字节证据成文。 作为参照,2026-09-09 原始差分尚有 3427 处,此后削减 99% 以上:83/83 是长跑的终点,不是起点的宣言。
超出 GNU 套件的语料
同一套 true-baseline 方法(脚本文件、对 GNU 5.3.0 的字节级 diff)也被用在 GNU 套件之外的评估语料与真实生态资产上,全部判定与清点存档于 rubash issue #477:
| 语料面 | 结果 |
|---|---|
| modernish 能力套件(跨 shell 怪癖探针) | 166/166 rc 向量一致 |
| mvdan/sh 解析器语料 | 559 个片段,解析接受与退出码对齐 |
| bash-completion 补全矩阵 | 452/452;bash -n 金丝雀逐字节一致 |
| git-completion | 140/140 |
| oh-my-bash | 22 个库加载、252/252 函数环境一致,5 套主题 PS1 逐字节一致 |
| ble.sh(29,601 行行编辑框架) | bash -n rc=0 对齐;source 模式可正常终止 |
| nvm.sh v0.40.x 加载器 | 载入逐字节干净(含 Windows 原生下空 NVM_DIR 自动使用) |
| FFmpeg / OpenSSH / PHP / ltmain / cmake configure | --help 与错误路径输出逐字节一致 |
| git 自家测试框架 t/test-lib.sh | 在引擎下端到端运行 |
上述资产全部钉为回归夹具在 CI 每次推送时运行;真实生态收割语料(数千仓、近万 资产,夜间巡检)持续把发现的真实缺陷回流为修复。
兼容 ≠ 相同实现
这组数字证明的是脚本可观察面的一致:退出码、stdout/stderr 字节、fd 行为、信号处置。它们不表示内部实现与 bash 相同——事实恰恰相反: 子壳与命令替换零进程创建(见执行模型), 路径翻译表驱动、无 MSYS 层(见路径与 MSYS)。 差异被契约文档框定、被台账公开(环境差异计零项逐套列名),这是「兼容是测出来的」 的另一半含义:不仅证明一致的地方,也把不一致与尚未收口的地方写在明处。
常见问题
「83/83 GNU 套件」是什么意思?
GNU Bash 上游自带的 83 套测试语料在真机 Windows 上全部通过,其中 82 套输出与 GNU Bash 5.3 逐字节一致;唯一残差(nameref 1 行)被逐字节证明是 GNU 自身的 coproc 回收竞态。兼容性是测出来的:另有 2,686 个真实生态仓 / 9,701 个资产每夜巡检。
niubash 和 Git Bash / WSL 有什么区别?
niubash 是 Rust 写的原生 Windows 程序:不捆绑 MSYS 模拟层,也不需要 WSL 虚拟机。Git Bash 在 spawn 前会启发式改写「看起来像路径」的参数(这正是 MSYS_NO_PATHCONV 咒语存在的原因),niu 的 argv 逐字节原样抵达;安装后全家族约 16 MB,Git Bash 约 440 MB。
性能怎么样?
一次性执行(niu -c true)经专项优化后 19.8ms;niu-git 启动约 14ms(Git Bash 45–103ms);命令替换与子壳类负载比 GNU bash 快 13–62x。全部数字附实测方法与复现产物,见「基准测试」(/benchmarks/)。
免费吗?支持哪些平台?
全部开源免费。niubash 提供 Windows x64 / arm64 原生安装包(winget:Unixwin.Niubash);引擎 rubash 另有 Linux(gnu/musl)、macOS、Android 与 OpenHarmony 五平台的 CI 门禁构建。