WinuxCmd:原生 Windows 的 Unix 命令集
一个原生 Win32 可执行文件,说 GNU 语法、走 Windows 真实路径:176 命令、 1,924 选项,单文件 3.79 MB。无 WSL、无 Cygwin、无 MSYS2、无路径翻译之痛—— 它是 niubash 工作流的命令那一半:shell 给语言, WinuxCmd 给命令。
github.com/unixwin/WinuxCmd ↗ 274 stars (repo-meta.json 实测 2026-10-19)
为什么是 WinuxCmd
在 Windows 上敲 grep -rn、sed -i、
find -exec、xargs -0,此前的每个选项都是妥协。
WinuxCmd 的立场是跳过妥协:不模拟 Unix,而是在 Win32 上把 GNU 的调用面实现出来。
不是虚拟机
WSL 给你 1 GB+ 安装与一道 VM 文件系统边界;WinuxCmd 是一个原生 Win32 可执行文件,直接操作你的真实文件。
不是模拟层
Cygwin 要你做路径翻译体操、付 2–5 秒启动;WinuxCmd 理解 C:\ 与 UNC 原生形态,冷启动约 19 ms,无运行时 DLL。
不是 2012 年的遗物
GnuWin32 停止维护于 2012 年、兼容度停在 60%;WinuxCmd 的差分语料 178 例对 GNU coreutils 9.7 oracle 实测 93% 通过。
不止 ~100 命令
同为原生命令集的 uutils 覆盖约 100 命令 / ~600 选项;WinuxCmd 携带 176 命令 / 1,924 选项,单文件 3.79 MB。
核心特性
- 原生而非模拟 直接调用 Win32 API:理解 C:\、D:/、UNC 路径与 NTFS ACL(配 cygpath / getfacl 桥接),无 VM、无运行时 DLL、即时启动。
- GNU 关键位全给 find 一个命令实现 88 个选项(完整表达式解析器、-exec/-execdir/-ok/-printf);grep 49 选项含 PCRE2;sed 支持就地 -i 编辑。
- 176 命令 / 1,924 选项 Coreutils 83 + findutils/grep/sed + BSD 工具 15 + 进程管理 13 + Cygwin/MSYS 桥 14 + 系统信息 16 + 自有扩展 10+,覆盖表见「深入」。
- wpm 内建 不该重造的工具(jq、ripgrep、fd、fzf、bat、make、neovim、curl、wget…)用内建包管理器一键装真发行版,详见 /products/wpm/。
- 双方言路径 POSIX 写法(/d/repo、/cygdrive/d、/mnt/d)与 Windows 原生写法(D:\repo)全部接受且真实折叠——方言能力链详见 /docs/paths-and-msys/。
- 中文输出(i18n) 消息目录经 wpm 安装(winuxcmd-i18n-zh-cn),WINUX_LANG 优先、回落 LC_ALL/LC_MESSAGES/LANG;WINUX_LANG=off 可整体关闭。
- 与 niubash 零胶水 niubash 启动时把 WinuxCmd 的命令链接注入 PATH——shell 里敲的 grep/sed/find 就是这枚二进制,无前缀、无配置。
- PGO 发布档 公开 x64 二进制按真实负载做 Profile-Guided Optimization 训练:sort −18%、nl −17%(对同一代码的非 PGO 构建)。
安装与快速上手
niubash 的 Windows 安装器自带完整 WinuxCmd root(预装)——安装到
{app}\winuxcmd\,PATH 指向 winuxcmd\bin,装完
niubash 即有全部 176 命令与内建 wpm,无需单独安装,
这是 Windows 用户的默认路径。不用 niubash 的用户才需要独立安装:从 GitHub Releases
下载安装器(WinuxCmd-<version>-x64-setup.exe,另有 ARM64 版与免安装
zip);已装旧版时用内建的 wpm 自更新——三条路径落到同一枚 winuxcmd.exe。
Windows:niubash 安装器自带完整 WinuxCmd root(预装);不用 niubash 的用户从 Releases 下载 setup.exe 独立安装
已装 WinuxCmd,更新自身(wpm 随本体内建):
wpm update winuxcmd 首跑引导
# 新开一个终端(让 PATH 生效),然后:
winuxcmd --version # 确认活动二进制与版本
ls --help # 任意命令的 GNU 帮助面
winuxcmd --list-all # 176 命令平铺清单(裸 winuxcmd 按 coreutils 分组)
wpm index update # 刷新包索引(wpm 内建,见 /products/wpm/)
中文输出:装消息目录并声明语言(未装目录时非英文 locale 会给出一行提示,#1155);
从源码构建需 VS 2022 + CMake 3.30 + Ninja,入口 scripts/build-with-vs.ps1,
PGO 复现用 scripts/build-pgo.ps1。
wpm install winuxcmd-i18n-zh-cn
export WINUX_LANG=zh-CN 深入:命令覆盖与分类
176 个命令按 GNU coreutils 风格分组(裸 winuxcmd 即分组清单,
--list-all 平铺全量);选项总数 1,924 为 src/commands/
中 OPTION( 宏的计数,命令数不含内建的 wpm 与 [ 别名。
| 分类 | 数量 | 代表命令 |
|---|---|---|
| GNU Coreutils | 83 | cp mv rm ln mkdir touch · cat head tail sort uniq cut tr wc · ls dir vdir · base64 md5sum sha256sum cksum · date seq expr env … |
| findutils / grep / sed | 3 | find(88 选项)、grep(49 选项,PCRE2)、sed(17 选项,就地 -i) |
| BSD 工具 | 15 | cal column hexdump logger tree less more strings rev watch tput … |
| 进程管理 | 13 | ps top kill killall pgrep pkill pidof pldd free uptime renice stdbuf timeout |
| Cygwin / MSYS2 桥 | 14 | cygpath dos2unix unix2dos d2u u2d …(迁移期的写法兼容) |
| 系统信息 | 16 | hostname id who pinky stty locale getconf getfacl ldd lsof file man … |
| 自有扩展 | 10+ | wpm(包管理器)mpicalc regtool mkpasswd mkgroup mkfifo mknod clear reset tzset |
来源:WinuxCmd README「Command coverage」(全表可展开节)与
DOCS/en/command_compatibility_matrix.md(176 命令逐条状态)。
差分测试:93% 是怎么来的
兼容度不是宣称,是对 oracle 实测的:178 例差分语料(131 语料 + 47 回归,覆盖
84 个命令)以相同输入对 GNU coreutils 9.7、findutils 4.10.0、grep 3.12、
sed 4.9、patch 2.7.6、util-linux 2.41、procps-ng 4.0.4 逐字节比对——
165 例通过、13 例为实名在册的平台差异(93%),机器校验落在
tests/differential/baseline.json。13 例不是雾里的「有时不一样」:
id -g 因 Windows 无 POSIX gid 而打印主组 RID、跨 \wsl.localhost
9p 的硬链在 WSL 侧跑不了(原生 NTFS 上已验证)、mkdir 已存在报错用
ASCII 引号而 GNU 用 locale 弯引号。CI 里每个 PR 都对 GNU master 跑同一差分
(oracle + compare 双 job),通过率与差异清单随代码一起审。
i18n 与 WINUX_LANG
语言选择器优先级:WINUX_LANG → LC_ALL →
LC_MESSAGES → LANG(src/utils/i18n.cppm,#1155)。
消息目录定位在 WinuxCmd 安装根,因此经由 shim 或 PATH 入口在安装目录之外调用时本地化同样生效
(#1151);目录本身是 wpm 包(如 winuxcmd-i18n-zh-cn),
WINUX_LANG=off 整体关闭目录。
与 niubash 的 PATH 注入联动
WinuxCmd 单独成立,也是 niubash 的命令层:
niu 启动时把 WinuxCmd 的命令链接注入 PATH,脚本里敲的
grep/sed/find 就是真二进制,零胶水。
更深一层(niubash#346 的 Windows 路径契约):捆绑的 WinuxCmd coreutils
「拥有 shell 树」——它们原样接收 shell 的 POSIX 写法并在子进程内自行解析,
而其余所有子进程(原生或 MSYS2/Cygwin 等外来 POSIX 运行时)一律收到原生
Windows 路径,无逐子进程探测、无 MSYS_NO_PATHCONV 类开关。
因此 WinuxCmd 的捆绑 pin 与 niubash 同步升级。
路径方言能力链
WinuxCmd 的参数边界认全部 POSIX 盘符形态:/d/repo(MSYS 单字母形)、
/cygdrive/d(Cygwin 形,#1145)、/mnt/d(WSL 形按
interop 折叠,#1172,与 rubash 的 argv 漏斗逐字节对齐)。方言 × 层的全量实测矩阵
与四层边界表见 路径与 MSYS。
实测数字
| 指标 | 数值 | 来源 |
|---|---|---|
| 单文件体积 | 3.79 MB(携带 176 命令 / 1,924 选项,静态链接、零依赖) | WinuxCmd README.md:74 |
| 冷启动 | ~19 ms | WinuxCmd README.md:74 |
| PGO 收益 | sort −18% · nl −17%(x64 发布档,真实负载训练) | WinuxCmd README.md:74 · scripts/build-pgo.ps1 |
| 质量门 | 差分 178 例 93%(165 通过 / 13 例平台差异实名在册)· 2,420 单元测试 99.6% | README.md · tests/differential/baseline.json |
| 负载对照 | cat 100 MB 0.8 s · sort 1M 行 2.1 s · grep 100 MB 1.2 s · find 10K 文件 0.3 s(与 GNU/WSL2 差距 ~10–15%) | README.md Benchmarks(Win11 · i7-13700K · 32 GB · NVMe) |
更多口径(git 启动 ~14 ms、一次性执行 26.3 ms 等 niubash 家族数字)见 基准页。
更新动态
最新 3 版(changelogs.json,抓取 2026-10-19;完整流水见 更新日志):
- 1.1.20(发布线,日期未标)
WSL interop 路径:
/mnt/X/…操作数与/X/…、X:\…同形折叠(#1172,与 rubash 的windows_mnt_drive_argument逐字节对齐); 当前最新发布 tag 为 v1.1.15(repo-meta.json 2026-10-19 实测;Releases 提供 x64/ARM64 setup.exe 与免安装 zip,README Install 表)。 - 1.1.19(2026-10-21)
wpm:
links verify逐路径报告不指向当前 winuxcmd.exe 的命令链接;winuxcmd-shim.exe小转发器把 shim 包的分发跳数从 24.5 ms 降到 12.1 ms;wpm update winuxcmd不再把命令链接静默留在旧镜像上;自更新回滚副本保留最新两份自动修剪。 - 1.1.18(2026-10-20)
wpm:被运行中进程占用的文件以 rename-aside 方式升级——要么完成、要么原样不动;
28 个
fsmonitor--daemon持有载荷的真实安装上强制升级验证通过;wpm clean staging/all一并清理 parked 的.wpm-old-<pid>。
相关链接
站内
- Niubash 产品文档 — 一条工作流的两半:shell 给语言
- Rubash 产品文档 — 路径方言与 argv 漏斗的引擎侧
- wpm 产品文档 — 内建包管理器与官方索引
- Oh My Niu 产品文档 — 主题与插件框架
- 路径与 MSYS:最大的行为差异
- 文档区首页 · 基准页 · 更新日志
仓内
常见问题
WinuxCmd 和 Git Bash 自带的 Unix 命令有什么区别?
WinuxCmd 是单个原生 Win32 可执行文件,携带 176 命令 / 1,924 选项(3.79 MB、零 DLL);Git Bash 靠约 440 MB 的 MSYS 模拟层提供同类命令,且 spawn 前会改写「像路径」的参数——WinuxCmd 的 argv 逐字节原样抵达。
WinuxCmd 性能如何?
约 19 ms 冷启动;PGO 构建下 sort 快 18%、nl 快 17%(README 实测口径)。
「对 GNU 差分」是什么意思?
每个 PR 自动对 GNU coreutils 9.7 跑 178 例差分语料(131 例覆盖 67 命令 + 47 例回归):93% 通过,13 例平台差异实名在册——命令行为是被测出来的,不是宣称的。
wpm 和 WinuxCmd 是什么关系?
wpm 直接编译进 winuxcmd.exe(winuxcmd wpm 即用),零运行时依赖、无独立安装步骤。
免费吗?支持哪些平台?
全部开源免费。niubash 提供 Windows x64 / arm64 原生安装包(winget:Unixwin.Niubash);引擎 rubash 另有 Linux(gnu/musl)、macOS、Android 与 OpenHarmony 五平台的 CI 门禁构建。