> **真·Bash,Windows、Linux、macOS 原生构建。**"只能跑 Windows"是旧印象:
> 现在有五个平台从这条树里构建,Windows 依旧是旗舰——不用 WSL,不开虚拟机,
> 没有 `/mnt/c`,没有 cmdlet 方言。一个二进制:你手指肌肉记得的那个 shell,
> 也是你 AI agent 天生会说的那个 shell。
[English](README.md) · [中文](README-zh.md)
文档与下载:[unixwin.dev](https://unixwin.dev)
[](https://github.com/unixwin/niubash/actions/workflows/ci.yml)
[](https://github.com/unixwin/niubash/releases)
[](https://github.com/unixwin/niubash)
[](https://github.com/unixwin/niubash)
[](LICENSE)
[](https://github.com/unixwin/niubash/stargazers)
**niubash** 是用 Rust 原生实现的 Bash 兼容 shell。在旗舰平台 Windows 上,
一个 `niu.exe` 打包全部:[rubash](https://github.com/unixwin/rubash) 语言引擎、
来自 [winuxcmd](https://github.com/unixwin/winuxcmd) 的真 Unix 命令、
带 git 状态的 prompt,以及带权限模型的插件系统。git 来自
[niu-git](https://github.com/unixwin/niu-git):用 MSVC 构建的 git-for-windows
真 C 源码,PATH 上的 `git` 就是 git 本体——没有 MSYS 运行时,没有启动器
跳板,不带 perl。`git --version` 起步 **~14 ms**(实测均值 13.7 ms / 最低
11.5 ms;`git status` 22.6 ms),Git Bash 的 `git` 要 45-103 ms
([niu-git#12](https://github.com/unixwin/niu-git/pull/12)、
[niubash#374](https://github.com/unixwin/niubash/pull/374));git 的
shell 脚本部分(hooks、`git bisect`、`git mergetool`)跑在 niubash 自己的
`sh` 上。从 niu 会话启动的 agent 会经 `SHELL` 继承它作为 shell;哪些
agent 跑什么 shell、怎么把其余的指过来,见
[Coding agents on Windows](docs/src/agents.md)。Linux 与 macOS 构建是
便携 `niu` 二进制,直接用系统自带的工具。niu 不是 MSYS2、Cygwin、Git Bash,
也不是 WSL——没有 POSIX 模拟层,也没有启发式的路径转换。每个平台的完整契约
(包括每个目标的诚实状态)见
[platform-support.md](docs/src/platform-support.md)。
## 平台支持
| 平台 | 状态 | 发布形态 |
|---|---|---|
| Windows x64 / ARM64 | 已发布;每次发布过烟测门禁 | 安装器 `.exe` + `.zip`,Unix 命令随包 |
| Linux x86_64 / aarch64(glibc 2.35+) | 已发布;每次发布过烟测门禁 | 便携 `.tar.gz`,用系统自带工具 |
| macOS aarch64 / x86_64 | 已发布;每次发布过烟测门禁 | 便携 `.tar.gz`,用系统自带工具 |
| Android aarch64 / armv7 | 仅 CI 构建,未发布 | NDK 链接 zip,只进 workflow 产物,未过烟测 |
| OpenHarmony(`aarch64-unknown-linux-ohos`) | 仅 CI check,未发布 | CI 保持可编译,未在真机运行 |
"烟测门禁"指产物构建完成后、上传之前,在它自己的 OS 上跑四项检查
(`--version`、`-c` 执行、一条穿过原生 coreutils 的管道、离线插件栈)
——门禁在 `release.yml` 里("no smoke, no artifact":Linux 腿在
`ubuntu-22.04`/`ubuntu-22.04-arm` 原生跑,macOS x86_64 腿在 Rosetta 2 下跑),
发布整体还额外被 golden user journey 与逐资产计时预算两道门拦着。
Android 和 OpenHarmony 还没过这道门:Android 产物只做了构建与链接验证
(ELF 形状检查,明确不是运行时烟测),OpenHarmony 只做了编译检查,
两者都不宣称可日常使用。各平台完整契约与
全量状态矩阵见 [platform-support.md](docs/src/platform-support.md)。
快答:
- **niu 需要 WSL 吗?** 不需要。niu 在所有发布平台上都是原生构建:Windows 上没有 Linux 虚拟机、没有模拟层、没有 `/mnt/c`。
- **niu 能跑在哪些平台?** 已发布:Windows(x64、ARM64)、Linux(x86_64、aarch64;glibc 2.35+)、macOS(aarch64、x86_64)。Android(aarch64、armv7)与 OpenHarmony(aarch64)在 CI 里构建,尚无发布;Android 另有一份实测性能基线(见[性能](#性能))。
- **niu 跑得了真 Bash 脚本吗?** 跑得了。rubash 引擎以 GNU Bash 官方上游测试套件作门禁,记录在[兼容性矩阵](docs/src/rubash-bash-compat-matrix.md)。
- **现在能在 Android 或鸿蒙上装 niu 吗?** 还不能。两个目标都能在 CI 里编译,但都没跑过运行时烟测,没有可安装的产物。
## 实证
下面每条 claim 都链到产出它的工件:入仓日志、基线文件、CI 门禁。
**6,336 个真实生态资产,逐个收割、逐个回放。** 管线从 GitHub 抓取 shell
脚本、框架、主题、dotfiles,逐个在 niu 下 source 并记录裁决:4,891 个
OK,350 个慢,224 个 GNU Bash 也过不了,101 个挂起,698 个拉取失败。
全量日志入仓([eco-harvest.py](scripts/harvest/eco-harvest.py)、
[eco-test.py](scripts/harvest/eco-test.py)、快照
[wt92-local-20261005](scripts/harvest/snapshots/wt92-local-20261005/))。
**生态框架是被 source、被计时的,不是一句"支持了"。** 逐资产计时基线
加载 437 个真实 oh-my-bash / bash-it 资产(166 款主题加上 plugins、
completions、aliases),每资产测三个阶段(source、首帧 prompt、重渲染),
取三次运行的中位数。两个框架自带的 nvm 资产就在这份基线里;真实用户
dotfiles 里加载 nvm.sh 的链路也走同一套 harness,分相计时在案
([基线](scripts/perf/baselines/asset-timing-baseline.json)、
[快照](scripts/harvest/snapshots/wt92-local-20261005/))。
**慢的发布发不出去。** [budgets.toml](scripts/perf/budgets.toml) 里每个
资产都带实测预算(健康主题重渲染 11-35 ms;预算线 120 ms;超预算 5 倍
硬失败)。[发布流水线](.github/workflows/release.yml)跑 `perfbudget`
门禁,超限即 fail 本次发布;另有每夜趋势跑盯漂移。
GNU Bash 上游 golden 套件的实测记录随引擎走:[rubash README](https://github.com/unixwin/rubash#readme)
带着台账(2026-10-12 全量重跑 83/83),rubash CI 每次推送都会在 Linux 上
回放上游语料("Bash upstream test progress" job,
`scripts/run-bash-upstream-tests.sh`)。
## 性能
下面每个数字都钉在测出它的 issue/PR 上,守住它的测试或门禁也一并写明。
**Windows 进程 spawn 成本——一个会话一个隐藏 console,而不是每个子进程
一个。** 无 console 会话(直启 `niu -c`、detached、CI)过去每次外部 spawn
都要付一次隐藏 console 分配,~22 ms/子进程(设计与形状见
[niubash#462](https://github.com/unixwin/niubash/issues/462))。修法已在
引擎侧落地([rubash#913](https://github.com/unixwin/rubash/pull/913)):
Windows 11 24H2+/Server 2025 上一次性预分配无窗 console
(`AllocConsoleWithOptions`),更老系统则认领首个 `CREATE_NO_WINDOW`
子进程的隐藏 console(`AttachConsole`)——整棵 `niu -c 'a; b; c'` 最多付
一次分配,后续 spawn 直接继承。14 条回归测试钉死零可见窗与缩放行为
(rubash `tests/console_window_gate.rs`)。
**`$(tput …)` 终端查询进程内作答。** tput 白名单内联臂
([rubash#884](https://github.com/unixwin/rubash/pull/884))对准入的
TERM×能力形状进程内作答,与 GNU ncurses 字节相等(269 行差分矩阵,
diff = 0;8 条回归测试)。票面探针——64 次 tput 调用走命令替换——
墙钟 1165 ms → 47 ms(~25x,零 spawn)。winuxcmd 侧的同族修复去掉了真
二进制里 ~17 ms/次 的 i18n 开销(修后进程内 ~0.4 ms;3208 行回放逐字节
一致:[WinuxCmd#1269](https://github.com/unixwin/WinuxCmd/pull/1269))。
harvest 里另一张 SLOW 面——`read` 撞 EOF ~4.8 s/次——仍在
[rubash#800](https://github.com/unixwin/rubash/issues/800) 开着。
**引擎热路径**(内嵌的
[rubash](https://github.com/unixwin/rubash) 引擎;每刀都带实测差值和
GNU 差分电池):
- 多词字面量命令 fast path:`[ 1 -eq 2 ]` ×20k ≈177→155 ms
([rubash#967](https://github.com/unixwin/rubash/pull/967))。
- `[[ ]]` 数值叶直接处理 + 十进制 fast path:50k `[[ 1 -eq 2 ]]`
对 GNU 从 1.41x → 1.10x
([rubash#966](https://github.com/unixwin/rubash/pull/966))。
- procsub 元数据扫描白名单跳过:1.56x→1.39x(~11%)
([rubash#974](https://github.com/unixwin/rubash/pull/974))。
- 十进制下标数组写 fast lane:交错 8k 从 3.65x → 3.16x;顺手修掉
`a[$((i++))]=v` 的真实双副作用
([rubash#959](https://github.com/unixwin/rubash/pull/959))。
- case:`$BASH_COMMAND` 只渲染头臂:20 臂 ×10k −10%,附真实分歧修复
([rubash#958](https://github.com/unixwin/rubash/pull/958))。
这波背后的解释器归因已带数字关闭:标量赋值 ~1.06x GNU(rubash#609 →
#672/#678),算术循环与参数扩展走 rubash#607/#608(#665/#671/#679、
#666);O(n²) 数组元素写变 O(1) 均摊(rubash#618/#616:assoc 5000 键
写入对 GNU 从 445x → 9.9x,indexed 736x → 3.8x;台账在 rubash 的
`docs/performance.md`)。export/unset 快车道家族已落地(#917/#918/#920,
#943 做正确性返工);[rubash#916](https://github.com/unixwin/rubash/issues/916)
对残留保持开放。
**Android 基线——实测、诚实、尚未复测。** Termux aarch64 平板上,
niubash 1.4.0 对 GNU bash 5.3.20
([niubash#352](https://github.com/unixwin/niubash/issues/352),方法与
全矩阵在票内):解释器受限负载慢 2.3-3.7x(`${x^^}` 单操作最高 7.3x),
`niu -c true` 21.1 ms 对 bash 8.3 ms(30 次中位数),峰值 RSS 2.2x——
而 fork 受限负载最高快 5.2x,真实 mkdir/写/回读脚本快 2.1x。引擎侧根因
已修完关闭(rubash#607-609),wrapper 一次性启动缺口也已关闭
([niubash#351](https://github.com/unixwin/niubash/issues/351):修后
`niu -c true` 15 ms 对 bash 13 ms,零 tput spawn)。
[niubash#349](https://github.com/unixwin/niubash/issues/349) 是最早的
~2.1x 算术/函数数据点。Android 真机上的修后复测还不存在——#352 为此
保持开放,Android 腿目前仍只有构建验证。
## 快速开始
下载统一从 [unixwin.dev](https://unixwin.dev) 进入。
Windows:去 [Releases](https://github.com/unixwin/niubash/releases) 下载
`niubash-v*-win-*-setup.exe` 双击——不要管理员权限,PATH 和 Windows
Terminal 配置自动配好。要便携版就拿 `.tar.gz`——捆绑的 git/awk 载荷以真
硬链接出厂,下载和解包都比 `.zip` 小得多(`tar -xf
niubash-v*-win-x64.tar.gz`,Windows 10+ 自带);`.zip` 留给只认 zip 的
工具链。
Linux(x86_64、aarch64;glibc 2.35+)与 macOS(aarch64、x86_64):拿
便携 tarball,解包即跑:
```sh
tar -xzf niubash-v*-linux-x86_64.tar.gz && niubash-v*-linux-x86_64/niu
```
源码构建(Rust 1.95+):
`git clone https://github.com/unixwin/niubash.git && cd niubash && cargo build --release`
配置只有一个文件:`~/.niubashrc`,纯 Bash 语法——从
[快速上手](docs/src/getting-started.md)开始。
## 文档
[文档站](https://unixwin.github.io/niubash/) ·
[Why niubash](docs/src/why-niubash.md)(长版论据 + agent 受害者案卷) ·
[平台支持](docs/src/platform-support.md) ·
[Bash 兼容性矩阵](docs/src/rubash-bash-compat-matrix.md) ·
[Roadmap](docs/src/niubash-roadmap.md)
---
如果 niu 帮你省掉了一台虚拟机、一段被改坏的引号、一个被 PowerShell 吃掉
的参数,[给仓库点个 Star](https://github.com/unixwin/niubash),转告下一位
开发者。★
## 许可证
MIT,详见 [LICENSE](LICENSE)。