微软把 Linux 命令"搬"进了 Windows!原生支持 ls/cp/grep,无需 WSL
📅 2026-07-03 | ⏱️ 阅读约 6 分钟 | 🔥 热点追踪
6 月初的 Build 2026 大会上,微软发布了一个让所有开发者眼前一亮的项目——Coreutils for Windows。不是虚拟机,不是子系统,不是模拟层——ls、cp、grep、find 这些 Linux 命令,直接原生跑在 Windows 11 上。
项目基于 Rust 重写的 uutils,一条 winget install 搞定,目前已开源在 github.com/microsoft/coreutils(MIT 许可)。
对于习惯在 Windows 和 Linux 之间切换的 Ubuntu 用户来说,这可能比 WSL 更香。
一、为什么微软要做 Coreutils?
跨平台开发者的日常困境:
| | | | |
|---|
| Linux / WSL / macOS | ls | cp | grep | find |
| Windows CMD | dir | copy | findstr | where |
同样的操作,命令完全不同。于是:
- • CI/CD 脚本需要维护 Windows 和 Linux 两套版本
- • 团队文档里要写"如果你用 Windows,请换成 XXX"
- • 开源项目的 README 安装步骤,Windows 用户经常卡在第一行
微软的解决方案很直接:
同样的命令、同样的参数、同样的管道操作,在 Windows 上也直接运行。
二、Coreutils 是什么?
不是 GNU Coreutils 的移植
微软没有直接拿 GNU Coreutils 的 C 代码编译一份 Windows 版,而是基于 uutils——一个用 Rust 从头重写 GNU Coreutils 的开源项目。
uutils 的特点是:
- • 内存安全(Rust 无 use-after-free)
微软在此基础上集成了三个上游项目:
| |
|---|
| ls, cp, mv, rm, cat, mkdir, rmdir, pwd, echo, date, sort, tee, sleep, hostname, uptime 等 |
| find |
| grep |
然后打包成一个 Windows 原生工具集——coreutils.exe。
三、一个巧妙的设计:单文件多命令
不是 100 个 EXE,是 1 个 + 硬链接
传统思路:每个 Linux 命令对应一个独立的 .exe 文件,100 个命令 = 100 个文件。
微软的做法:
┌──────────┐│coreutils.exe│ ← 唯一的真实文件└──┬────┬──┘ │ │ ← NTFS 硬链接(Hard Link),不占额外磁盘空间 │ │ls.exe cp.exe cat.exe rm.exe grep.exe find.exe ...
安装后,ls.exe、cp.exe、grep.exe都是 coreutils.exe 的 NTFS 硬链接。
怎么区分执行哪个命令?
程序启动时读取 argv[0]:
用户敲 ls → 启动 ls.exe → coreutils.exe 看到 argv[0]="ls" → 执行 ls 功能用户敲 cp → 启动 cp.exe → coreutils.exe 看到 argv[0]="cp" → 执行 cp 功能用户敲 grep → 启动 grep.exe → coreutils.exe 看到 argv[0]="grep" → 执行 grep 功能
一个二进制,多个入口,零冗余。
这种设计的优势
| | |
|---|
| | 几乎等同于 1 个文件 |
| | 只升级 coreutils.exe |
| | 低 |
四、安装与使用
安装(一条命令)
winget install Microsoft.Coreutils
也可以从 GitHub Releases 下载。
使用(跟你熟悉的 Linux 一样)
# 列出文件(带颜色)ls -la --color=auto# 搜索日志grep ERROR app.log# 递归查找find . -name "*.js" -type f# 管道操作find . -name "*.log" | grep ERROR | sort# 延时sleep 5 && echo "done"
管理已安装的命令
Coreutils 还提供了一个 coreutils-manager 工具:
# 禁用不想要的命令coreutils-manager disable <命令名># 查看帮助coreutils-manager --help
五、哪些命令能用?哪些不行?
✅ 已支持的命令(部分)
| | | |
|---|
ls | | find | |
cp | | grep | |
mv | | sort | |
rm | | tee | |
cat | | sleep | |
mkdir | | uptime | |
rmdir | | hostname | |
pwd | | echo | |
date | | expand | |
🛑 故意不提供的命令
| |
|---|
| 与 Windows 内置命令冲突 | dir |
| 依赖 POSIX 信号机制 | kill、timeout(Windows 无 SIGTERM 等信号) |
| 依赖 POSIX 权限/用户模型 | chmod、chown、chgrp、chroot、groups、id、users、who |
| 依赖 POSIX 终端/设备 | tty |
部分命令(如 kill)微软表示未来可能探索 Windows 替代实现。
六、Shell 兼容性注意
| |
|---|
| CMD | |
| PowerShell 7.4+ | ⚠️ 部分命令与 PowerShell 别名冲突(如 ls → Get-ChildItem) |
| PowerShell 7.6+ | |
冲突处理
PowerShell 中,ls 等命令默认会调用 PowerShell 的内置别名而非 Coreutils:
# 查看当前 ls 是什么Get-Command ls# 如果输出 Get-ChildItem,说明被别名覆盖
解决方法:
- 1. 用完整路径调用:
coreutils.exe ls - 2. 调整 PATH 顺序,让 Coreutils 目录排在前面
- 3. 在 PowerShell Profile 中移除别名:
Remove-Item Alias:ls -Force
七、Windows 特有的几个坑
| | |
|---|
| 换行符 | \n | 文件可能为 \r\n (CRLF),uniq 等可能受影响 |
| 无 /dev/null | > /dev/null | |
| 无 POSIX 信号 | Ctrl+C | Ctrl+C |
| 路径分隔符 | / | / |
| 文件权限 | chmod 755 | |
| 符号链接 | ln -s | |
八、对比:WSL vs Coreutils
| | |
|---|
| 原理 | | |
| 兼容性 | | |
| 性能 | | |
| 内存占用 | | |
| 适用场景 | | |
| 安装复杂度 | | winget install |
一句话结论:你需要跑 Linux 服务器 → WSL;你只是想在 Windows 上用熟悉的命令 → Coreutils。
九、这对 Ubuntu 用户意味着什么?
这背后是微软一个非常清晰的战略转向:
2016 → WSL 12019 → Windows Terminal2020 → WSL 2 / Docker 深度集成2021 → Windows Package Manager (WinGet)2024 → sudo for Windows2026 → Coreutils for Windows
微软不再要求开发者适应 Windows,而是让 Windows 适应开发者。
对于 Ubuntu 用户:
- • 纯 Linux 用户:你不需要 Coreutils,但你的同事用了 Windows 后可以无缝协作
- • 双系统用户:切到 Windows 时不用再记
dir / copy / findstr 了 - • WSL 用户:轻量脚本可以直接在 Windows 终端跑,不用启动 WSL
写在最后
Coreutils for Windows 的意义不只是一个工具包——它是微软"Windows 是一个出色的开发平台"战略的最新里程碑。
Rust 重写 + 单文件硬链接 + WinGet 一键安装,这个组合把 Linux 命令行体验原封不动地带到了 Windows 上。虽然 chmod、kill 等 POSIX 特性暂时缺席,但对 90% 的日常操作来说完全够用。
如果你在 Windows 上偶尔想念 ls -la 和 grep --color=auto,一条 winget install Microsoft.Coreutils,搞定。
💡 UbuntuNews | 资讯·工具·教程·社区🐧 关注我们,获取更多Ubuntu/Linux技术干货💬 加入QQ群/频道,与全国爱好者交流成长❤️ 觉得有用?点个"在看"分享给更多人!