目标:追求 Windows 下原生的 shell 体验


windows 终端工具首选 Windows 终端 毋庸置疑,但 shell 有多种选择:

Windows 下的 shell 方案

工具简介特点适用场景
cmd传统的 Windows 命令行工具- 基本命令行界面
- 不支持类 Unix 命令集
- 轻量级
- 简单的文件管理和基本命令执行
- 兼容老旧 Windows 应用程序
PowerShellWindows 的高级脚本语言和命令行工具- 支持对象导向编程
- 强大的管道支持
- 可以处理各种系统管理任务
- 高级系统管理
- 脚本编写
- 管理多个 Windows 系统
Git Bash基于 MinGW 的 Bash 仿真环境,通常与 Git 一起使用,也可在此基础上使用 zsh- 支持类 Unix 命令集(如 lsgrepawk 等)
- 适用于 Git 操作
- 需要 Git 支持时使用
- 喜欢类 Unix 环境的用户
NuShell现代化的 Shell,基于 Rust 开发,支持对象和管道化操作- 对象驱动:可以处理结构化数据
- 现代管道化操作(支持 JSON, CSV, TSV 等格式)
- 强大的跨平台支持
- 处理复杂数据
- 现代脚本编写
- 数据流处理和集成化任务
Fish一种用户友好的命令行外壳,强调交互性和可用性- 强大的自动补全和建议功能
- 语法高亮和错误提示
- 支持函数和变量的自动建议
- 需要友好交互体验的用户
- 喜欢类 Unix 环境的用户
WSLWindows 子系统 Linux,允许在 Windows 上运行 Linux 环境- 原生支持 Linux 命令和工具
- 可以使用 apt 等包管理工具
- 与 Windows 文件系统无缝集成
- 需要 Linux 环境的开发者
- 需要使用 Linux 工具的用户
MSYS2Windows 上的类 Unix 环境,基于 Cygwin,支持更多的工具和库- 类 Unix 环境,支持大量 Linux 工具
- 可以安装大量 Linux 兼容的软件包
- 需要更复杂的类 Unix 开发环境
- 对工具链有特殊需求时

Note

MSYS2 不属于 Shell,而是一个更大的工具集合,里面包含了终端模拟器 + Shell + 开发环境。 WSL 也不属于 Shell, 而是一个更大的工具集合,里面包含了 Linux 内核 + 终端模拟器 + Shell + 开发环境

此处列举 MSYS2 和 WSL 只是提供 Windows 下的类 Unix 环境的 Shell 选择。

建议的 shell

目前 Windows 下建议的 shell 就 3 种:pwsh7、nushell,其他不用考虑了

Nushell

  • Git Bash 以及在其基础上的 zsh:
    • 优点:可以在其基础上安装 zsh 以及 zinit,达到在类 Unix 平台中使用 zsh 的效果
    • 缺点:
      • 性能问题,即使使用 zinit 有时还是很慢
      • git bash 本身有的 unix 命令比较少,拓展也比较麻烦
  • Msys2:
    • 优点:因为 Git bash 就是基于 msys2 开发的,所以不仅可以达到 Git Bash 的效果,而且相比 Git Bash 有更完整的 unix 环境(如支持很多 unix 命令),还有包管理工具 pacman ,是 mingw 和 mingw-clang 开发环境的不二之选
    • 缺点:
      • 还是性能问题
      • msys2 工具很鸡肋:msys2 下的工具只适合在其开发环境下使用,不适合暴露给外部 windows 环境,如 VSCode 使用 msys2 下安装的 git,cmake,ninja,python 等都会出一些问题,因此无法靠 msys2 来管理或安装 Windows 原生软件
  • cmd 和 powershell:
    • 优点:windows 自带的 shell 环境,可保底
    • 缺点:太简陋,功能少
  • nushell:
    • 优点:
      • 快!
      • 更现代化,灵活(可定制化程度高)、功能强大
      • 更好的跨平台支持
    • 缺点:
      • 不支持基于 bash、sh 的脚本或工具
      • 自动补全非常简陋,除了自带命令,可以说是没有(⌚ 2025-07-07 ❌)(可能是暂时的,有人已在 issue 提出);后发现 carapace 能非常好的集成到 nushell,那这个问题也就没那么明显 ✅
      • 生态也比较差,暂时还没看到特别出彩的插件,脚本 或工具(⌚ 2025-07-07)不过有一些 shell 和平台无关的工具还是非常给力(如 zoxidestarship、)

PowerShell7

除了 Windows 兼容性,没别的优势了,比如在 Windows 下用 Copilot 代理模式,其会默认你使用的 pwsh,如果用 nushell 命令总会出错。

目前 pwsh 最新版到 7 了,比较现代化了,但总体体验下来,在补全、历史命令搜索等方面都不如 Nushell, 更不如 Zsh 了

pwsh 用下来还有个问题就是慢。。。和 Nushell,Zsh 没法比,但兼容性问题摆在这,不用没办法

Git Bash 中的 Zsh

这一套其实是比较麻烦的,如果看重 Zsh 的丝滑体验可以采用这种方案,但有个问题是 Git Bash 其实是基于 msys2 开发的,好处是其 $HOME 不像 msys2 基于其安装目录,而是基于系统目录,坏处是无法达到 Windows 丝滑的原生体验了,毕竟套了一层壳。

不建议的 shell

MSYS2(MinGW)

经过实践,非常不建议使用 MinGW 环境,如果想要类 Unix 命令环境,还不如使用 WSL

MinGW 的一个致命问题是:安装 MinGW 后打开的终端 HOME 就是 C:\msys64\home\<user>, 一些加入系统 Path 的路径下的可执行文件都识别不了,而 Git Bash、Nushell、PWSH 的 $HOME 和 Windows 是一致的, 都是 C:\Users\<user>

如果实在是有 MinGW 构建的需求,建议使用容器。

WSL

如果 Windows 下开发,应该经常要用到 Windows 下的 VSCode 以及其他 windows 应用,(注:VSCode 可以通过 WSL 插件链接到 WSL 环境),且 WSL 和 Windows 基本都不是同一文件系统了(虽然可以相互挂载,但总存在注入性能之类的问题,总归不是很原生),不推荐作为 Windows 主力 shell,一般也即要 Linux 构建环境时才用到 WSL

Fish

虽然官方号称支持 Windows,但仔细看文档发现是得安装在 WSL、MSYS2 等套壳环境下,那实际使用起来肯定会遇到各种奇奇怪怪的环境问题,非常不原生,不建议 Windows 下使用。

另外,既然都套壳了,为啥不直接使用 Zsh 呢, Zsh 插件生态非常 OK, 以补全为例, Zsh 完全可以通过 zsh-users/zsh-autosuggestions 达到 fish 那样的效果。