WinuxCmd:原生 Windows 的 Unix 命令集

一个原生 Win32 可执行文件,说 GNU 语法、走 Windows 真实路径:176 命令、 1,924 选项,单文件 3.79 MB。无 WSL、无 Cygwin、无 MSYS2、无路径翻译之痛—— 它是 niubash 工作流的命令那一半:shell 给语言, WinuxCmd 给命令。

C++23 Windows x64 · ARM64 v1.1.20 MIT

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

不是虚拟机

WSL 给你 1 GB+ 安装与一道 VM 文件系统边界;WinuxCmd 是一个原生 Win32 可执行文件,直接操作你的真实文件。

Cygwin

不是模拟层

Cygwin 要你做路径翻译体操、付 2–5 秒启动;WinuxCmd 理解 C:\ 与 UNC 原生形态,冷启动约 19 ms,无运行时 DLL。

GnuWin32

不是 2012 年的遗物

GnuWin32 停止维护于 2012 年、兼容度停在 60%;WinuxCmd 的差分语料 178 例对 GNU coreutils 9.7 oracle 实测 93% 通过。

uutils

不止 ~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>。

相关链接

常见问题

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 门禁构建。