blog.dopana

Back

每次你写跨平台脚本时,Windows都会破坏它。你输入 greplssort——然后 shell 盯着你看:not recognized。你切换到 Git Bash,然后是 WSL,然后把脚本翻译成 PowerShell。Windows 和 Linux 命令行之间的”柏林墙”仍然存在。

在 Build 2026 上,Microsoft拆毁了它——至少是部分地。Coreutils for Windows 原生提供 75+ 个 Unix 命令,无需 VM,无需兼容层,只需一个 winget install

Microsoft Coreutils 是什么#

Microsoft Coreutils 是 uutils/coreutilsfindutilsgrep 的 Microsoft 维护版本,打包为 Windows 的单一多调用二进制文件。它用 Rust 编写——不是原始 C 代码库的端口,而是一个内置内存安全性的现代重新实现。

[!NOTE] 这不是兼容层。ls.exe 是一个原生 Win32 PE 二进制文件,直接调用 Windows NT 系统 API。没有 VM,没有翻译层,没有 bash.exe 包装器。

安装:

winget install Microsoft.Coreutils
bash

就是这样。75+ 个命令立即出现在你的 PATH 中:lscatcpmvrmgrepfindsortheadtailwccuttrteesleeppwdhostnamexargsdiffstattouch 等等。

架构:为什么这次不同#

解决方案架构启动时间内存文件系统
WSL2Hyper-V VM 中的 Real Linux kernel数秒GB 级别隔离(/mnt/c 边界)
Git BashMSYS2 / MinGW 模拟层快速数十 MB需要路径转换
CygwinPOSIX compatibility DLL 层快速数十 MB需要路径转换
Coreutils原生 Win32 PE 二进制文件<1ms几 MB直接访问

差异是结构性的。WSL2 需要 5 个抽象层(Linux userspace → Linux kernel → Hyper-V → Windows)。Coreutils 只需要 2 个(coreutils.exe → Windows NT Kernel)。像 find . -name "*.rs" | xargs grep "fn main" | sort -u 这样的管道以真正的 Windows 进程运行,而不是模拟的 Linux 进程。

[!TIP] 类比:WSL 就像在家里建一个”Linux房间”——你必须走进那个房间才能使用 Linux 工具。Coreutils 就像给你的房子”Linux语言能力”——你站在 Windows 客厅里就能流利地说 Linux。

与 WSL 和 Git Bash 的比较#

WSL2#

WSL2 运行一个 real Linux kernel。这是它的超能力——也是它的局限。你获得包管理器(apt)、原生 Python/Node/Rust 工具链、无需 Desktop 的 Docker,以及完整的 POSIX 兼容性。但:

  • 文件系统边界。 /mnt/c/ 上的 Windows 文件存在 I/O 开销。Linux 文件与 Windows 应用程序隔离。
  • VM 启动成本。 需要数秒启动。不是即时的。
  • 内存占用。 GB 级别的基线。
  • 进程隔离。 Windows 应用程序无法直接通过桥接从 WSL 进程管道输入。

当需要完整 Linux 环境时——运行 Linux 原生应用程序、编译为 Linux、使用 apt 或运行 Docker——WSL2 仍然是正确的选择。

Git Bash#

Git Bash 随 Git for Windows 一起发布。它捆绑了 Bash + MSYS2 + 一套 Unix 工具。但:

  • 它是一个独立的 shell 环境。你无法在不切换上下文的情况下从原生 PowerShell 或 CMD 会话使用 Git Bash 命令。
  • 路径转换(反斜杠 vs 正斜杠、驱动器字母)引入了微妙的行为差异,可能破坏为真实 POSIX 系统编写的脚本。
  • 工具集有限,依赖于已在 Windows 8 之后deprecated 的 MSYS2 兼容层。

Git Bash 在 Bash-centric 的 Git 工作流中保持其价值。但对于在现有 shell 中透明地提供 Unix 命令,它不够用。

Coreutils 填补空白#

Coreutils 在你现有的 PowerShell 或 CMD 会话中直接提供 Unix 命令——无需切换上下文,无需独立 shell,无需路径转换。这些命令的行为类似于其 Linux 对应命令,因此跨平台脚本无需翻译即可迁移。

能运行的命令和不能运行的命令#

Coreutils 提供有用的子集,而非完整的 GNU Coreutils。仅 POSIX 的工具被排除,因为 Windows 没有等效的内核功能。

CategoryCommands
File operationsls, cp, mv, rm, cat, touch, mkdir, ln, stat
Text processinggrep, sed, awk, cut, sort, uniq, wc, head, tail, xargs, tee
Searchfind, locate
System infodate, hostname, uptime, pwd, whoami (via built-in)
Otherdiff, basename, dirname, mktemp, printf, seq, tr, paste, split, comm, join, shuf

故意排除的命令:

  • chmodchownchrootmkfifottyuserswho——在 Windows 上没有等效的纯 POSIX 概念
  • kill——Windows 缺少 POSIX 信号机制
  • direxpandmoretimeoutwhoami——与 Windows 内置命令冲突(官方矩阵中标记为 🛑)

[!WARNING] PowerShell 冲突是真实的。像 catlssortfindecho 这样的命令有 PowerShell 的 alias 或 cmdlet。PowerShell 按以下顺序解析:Alias → Function → Cmdlet → External executable。调整 PATH 顺序或使用 coreutils-manager disable <command> 来控制优先级。需要 PowerShell 7.4+。

Windows 注意事项#

DifferenceDetail
CRLF line endingsWindows 文本文件使用 \r\n。Coreutils 工具可能表现出与 Linux 不同的行为。必要时用 sed -i 's/\r$//' file 转换。
File permissionsWindows ACL 不映射到 POSIX permissions。chmodchown 缺失。
Signals没有 SIGTERM/SIGKILL 模型。killtimeout 不可用。
Case sensitivityWindows 文件系统默认不区分大小写。Coreutils 尊重这一点。
PATH orderPowerShell alias 可能遮蔽 coreutils 命令。

何时使用什么#

Situation使用
在 PowerShell/CMD 中原生使用 greplsfindcatCoreutils
必须在 Linux 和 Windows 上运行的跨平台 shell 脚本Coreutils(也在 Linux 上测试)
完整 Linux 环境、包管理器、Docker、Linux 原生应用WSL2
Bash-centric Git 工作流Git Bash
在 Windows Terminal 中快速文本处理Coreutils
完全 POSIX 合规、syscalls、C 库WSL2

面向 AI 编码智能体的 Token 优化#

在 AI 时代,这是一个意想不到却价值连城的绝佳优势:Windows 上的 Coreutils 能为 AI 编码智能体(如 Claude Code、Cursor、Copilot、Cline、Aider 等)节省大量的上下文 Token。

问题根源:PowerShell 的输出过于冗长(Verbose Output)#

当 AI 智能体在 Windows 上执行命令以勘探代码库或排查日志时,PowerShell 默认输出格式化的对象表格,附带大量空格、列标头和元数据:

# PowerShell Get-ChildItem (ls)
Get-ChildItem -Path . | Select-Object -First 3
# Output:
#     Directory: C:\repo
# Mode                 LastWriteTime         Length Name
# ----                 -------------         ------ ----
# d----            9/2/2026  10:15 AM                src
# -a---            9/2/2026  10:12 AM           1024 package.json
# -a---            9/2/2026  10:14 AM           3420 README.md
powershell

与此相反,Coreutils 的 lsfind 返回极为精炼的纯 Unix 文本流:

# Coreutils ls
ls -1
# Output:
# src
# package.json
# README.md
bash
graph TD
    subgraph powershell_std [标准 PowerShell]
        A[AI 智能体命令] --> B[PowerShell Cmdlet]
        B --> C[表格输出 + 标头 + 冗余空格]
        C --> D[~400 - 1,200 Tokens 进入上下文]
    end
    subgraph coreutils_clean [Coreutils 精简流]
        E[AI 智能体命令] --> F[Coreutils 原生管道]
        F --> G[已过滤的 Unix 纯文本流]
        G --> H[仅 ~40 - 150 Tokens 进入上下文]
    end

端侧前置过滤管道(Pre-filtering)节省海量 Token#

若没有 Coreutils,Windows 上的 AI 智能体往往被迫将整个大文件的内容读入 LLM 上下文再自行过滤,或是写出冗长的 PowerShell 脚本。有了 Coreutils:

  1. 利用 grephead/tail 精准抓取行:无需将 5,000 行的日志文件(约 20,000 tokens)全盘读入上下文,智能体仅需运行 grep -n "FATAL" app.log | head -n 10 即可只带回 10 行关键信息(约 100 tokens)。
  2. wc -l 快速统计行数:直接获得行数或匹配数,而无需将实际内容传输到 prompt 中。
  3. cutawk 裁切列数据:在本地提炼出所需字段后再送入提示词。
  4. 统一跨平台 Prompt:智能体的系统提示词不再需要为 Windows CMD/PowerShell 与 Unix Bash 分别维护复杂的指令分支。

[!TIP] ELI5(像对 10 岁孩子一样解释):想象一下,你让 AI 从一本 500 页的书里找一句话。没有 Coreutils,你得把整本 500 页全复印发给 AI(浪费很多复印费和阅读时间)。有了 Coreutils,你用剪刀直接把那句话剪下来单独寄给 AI 看。

最终收益:Windows 上的 AI 智能体在命令交互循环中,每次执行可削减 60% 至 85% 的无谓上下文 Token 消耗。

总结#

  • Microsoft Coreutils 将 75+ 个 Unix 命令原生带到 Windows——对于基本文本处理和文件操作,无需 WSL、Cygwin 或 Git Bash。
  • 它是一个原生 Win32 二进制文件(Rust/uutils),不是 VM,也不是模拟层。
  • 显著降低 AI 智能体 Token 消耗:精炼的纯文本流输出与 grep | head | cut 管道,相比 PowerShell cmdlet 减少了 60% 至 85% 的格式化冗余 Token。
  • 它不替代 WSL 的完整 Linux环境,也不替代 Git Bash 的 Bash-centric 工作流。
  • 它填补了”我需要 PowerShell 中立即使用 grep”和”我需要完整 Linux 系统”之间的空白。
  • 柏林墙尚未完全倒塌——但一座桥刚刚开通。

References#