目标:追求 Windows 下原生的 shell 体验
windows 终端工具首选 Windows 终端 毋庸置疑,但 shell 有多种选择:
Windows 下的 shell 方案
| 工具 | 简介 | 特点 | 适用场景 |
|---|---|---|---|
| cmd | 传统的 Windows 命令行工具 | - 基本命令行界面 - 不支持类 Unix 命令集 - 轻量级 | - 简单的文件管理和基本命令执行 - 兼容老旧 Windows 应用程序 |
| PowerShell | Windows 的高级脚本语言和命令行工具 | - 支持对象导向编程 - 强大的管道支持 - 可以处理各种系统管理任务 | - 高级系统管理 - 脚本编写 - 管理多个 Windows 系统 |
| Git Bash | 基于 MinGW 的 Bash 仿真环境,通常与 Git 一起使用,也可在此基础上使用 zsh | - 支持类 Unix 命令集(如 ls、grep、awk 等)- 适用于 Git 操作 | - 需要 Git 支持时使用 - 喜欢类 Unix 环境的用户 |
| NuShell | 现代化的 Shell,基于 Rust 开发,支持对象和管道化操作 | - 对象驱动:可以处理结构化数据 - 现代管道化操作(支持 JSON, CSV, TSV 等格式) - 强大的跨平台支持 | - 处理复杂数据 - 现代脚本编写 - 数据流处理和集成化任务 |
| Fish | 一种用户友好的命令行外壳,强调交互性和可用性 | - 强大的自动补全和建议功能 - 语法高亮和错误提示 - 支持函数和变量的自动建议 | - 需要友好交互体验的用户 - 喜欢类 Unix 环境的用户 |
| WSL | Windows 子系统 Linux,允许在 Windows 上运行 Linux 环境 | - 原生支持 Linux 命令和工具 - 可以使用 apt 等包管理工具 - 与 Windows 文件系统无缝集成 | - 需要 Linux 环境的开发者 - 需要使用 Linux 工具的用户 |
| MSYS2 | Windows 上的类 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:
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 那样的效果。