为了几条命令开 WSL?现在真没必要了

在 Windows 上找一个几天前改过名的配置文件、从一堆日志里筛出报错行,习惯了 Linux 终端的人往往手比脑子快——还没想清楚,WSL 的标签页已经开好了。问题是,为了这么几条命令挂着一整个 Linux 子系统,每次都要从一个环境跳到另一个环境再跳回来,思路就被打断了。

MakeUseOf 撰稿人 Afam Onyimadu 分享,他复盘之后发现自己真正离不开的只有八条命令:ls、grep、find、cat、sort、head、tail、wc。微软在 Build 2026 上推出的 Coreutils for Windows 正好补的就是这个缺口——它基于 Rust 编写的 uutils/coreutils 项目,把 coreutils、findutils(find、xargs)和一个 GNU 兼容的 grep 打包在一起,原生跑在 Windows 上。

一、安装与验证

  1. 打开管理员权限的终端,执行 winget install Microsoft.Coreutils,也可以从 GitHub 的 microsoft/coreutils 仓库下载安装包。
  2. 安装程序会把工具写入系统 PATH。磁盘上其实只落了一个 C:\Program Files\coreutils\coreutils.exe,再用 NTFS 硬链接生成 ls.exe、cat.exe 等一堆同名入口,程序靠自己被调用时的文件名决定执行哪个工具。
  3. 执行 cat --version 验证,正常应返回 uutils 的版本号。每条命令都支持 --help 查看完整参数。

二、先解决 PowerShell 的别名冲突

这是最容易踩的坑。PowerShell 自带 ls、cat、pwd 等内置别名,优先级高于 PATH,敲下去跑的仍是 Get-ChildItem、Get-Content。

  1. 诊断:执行 Get-Command cat,若 CommandType 显示 Alias,就是命中了别名。
  2. 临时解除当前会话的别名:Remove-Item alias:cat -Force;想长期生效,把这行写进 $PROFILE,每个冲突命令各写一行。
  3. 也可以直接带后缀调用,比如 ls.exe
  4. 最省事的办法是改用命令提示符(CMD),CMD 下不存在这类别名冲突。微软文档里有一张兼容对照表,标出了 PowerShell 7.4 及以上版本中「已安装但会冲突」的工具。

三、可以直接照搬的用法

ls -la 和递归 find 都能原生跑通,grep -r 在整个项目目录里搜索也正常。该撰稿人常用的日志排查管线 cat access.log | grep 500 | sort | uniq | wc -l 可以原样执行;批量重命名文件、裁剪日志输出的几个 bash 单行脚本,几乎不用改就跑起来了——同样的逻辑若改写成 PowerShell,得换一套语法和对象管线思路。此外,在大型项目目录上做递归 grep 和 find,因为少了一层文件系统转换,速度比在 WSL 里更快。

四、这些命令没有

chmod、chown、chroot、tty、who、id 依赖 Windows 不具备的 POSIX 权限模型,kill 和 timeout 则因为 Windows 没有 POSIX 信号,一并缺席。dir、more、expand、whoami 是微软刻意没收录的,避免覆盖 Windows 自带版本。另外要留意:/dev/null 在 Windows 这边写作 NUL;CRLF 行尾会影响 wc 的字节统计和正则里的 $ 锚点匹配,脚本对输出精度敏感的话,上线前先测一遍。

微软目前仍把它标为预览版。真正涉及包管理器、容器和完整 Linux 环境的活,还是归 WSL。

来源:MakeUseOf