Windows 上 Terminal 开发最搭配的套装:Fresh + Nushell + coreutils
先说说我为什么折腾这个组合。Long story short——之前我一直在 Windows Terminal 里用 PowerShell 5.1 应付日常,后来换到 PowerShell 7,确实舒服了一些,但总觉得差点意思。直到我同时接触了 Nushell 和 coreutils 的 Windows 版本,再加上 Fresh 这个主题管理工具,整套终端体验才真正“通”了。
如果你是一个每天要在终端里耗上几个小时的开发者或运维,又恰好主力机是 Windows,那这篇文章值得你花十分钟看完。我不会讲太多抽象的“现代化终端”概念,就实打实拆解这个套装怎么搭、怎么配、怎么用,以及我踩过哪些坑。
先给结论:这套组合核心解决三件事——Shell 本身好用、常用命令不别扭、外观长期稳定不折腾。Nushell 负责“数据结构化输出”,coreutils 负责“补全 Windows 缺失的类 Unix 命令”,Fresh 负责“让配置文件像项目一样可维护”。三个东西各管一摊,组合起来就是 Windows 上很舒服的开发终端底座。
1. 内容整体设计与思路拆解
1.1 为什么是 Nushell,而不是继续用 PowerShell 或转向 WSL
先回答一个大家必然要问的问题:Windows 上有 PowerShell,还能装 WSL 用 bash/zsh,凭什么还要用 Nushell?
我个人的判断是:PowerShell 的对象管道虽然强大,但语法琐碎,别名和模块体系混乱,写起来总有一种“为了任务而任务”的负重感;WSL 虽然能让你用上真正的 Linux 环境,但在 Windows 和 Linux 之间切换文件路径、处理性能损耗、管理发行版,本身又是一层额外的心智负担。而 Nushell 恰好站在一个有趣的位置上:它原生跑在 Windows 上,不需要虚拟机或子系统,同时又吸收了 Unix Shell 的管道哲学,并把管道的输出提升到了“结构化数据”的层面——每条命令的产出不再是纯文本,而是像表格一样的记录列表。
这带来的直接好处是:你不用再用findstr或正则表达式去痛苦地解一大段文本。比如你执行ps,拿到的直接就是进程列表,可以像操作表格一样按 CPU 排序、按内存过滤、选取特定列。这种体验在 PowerShell 里其实也能做,但 Nushell 把它做得更轻、更顺手,默认行为就非常合理。
还有一个很现实的理由:Nushell 的语法对“脚本阅读”非常友好。你写一段配置或者自动化脚本,过两周回来看,依然能快速看懂每一行在做什么。数据进到管道之后,每个阶段都明确地显示出“输入是什么、转换了什么、输出是什么”,这对日常开发调试极有价值。
1.2 为什么还要 coreutils,Nushell 不是自带了很多命令吗
Nushell 自带了不少内置命令,日常操作足够,但真要把它当主力壳用,还是会碰到一些“缺胳膊少腿”的时候。比如cp、mv、rm这类命令,Nushell 有自己的实现,行为上跟 GNU coreutils 有细节差异;再比如你想用wc -l统计行数,用realpath获取绝对路径,用du查看目录占用,Nushell 内置命令有类似功能,但参数习惯和输出风格都不完全一样。
这时候 coreutils 的价值就出来了。Windows 上的 coreutils(我建议直接装 GnuWin 或 通过包管理器拉一套通用二进制)提供了大量标准的 Unix 命令,像是ls、cat、cp、mv、rm、sed、awk、grep、find、sort、uniq、wc、cut等等。把它们放进 PATH 之后,你就能在 Nushell 里用外部命令补齐内置能力的盲区。
我的搭配思路是:能用 Nushell 内建命令解决的,优先用内建;处理复杂文本、做管道过滤、需要 GNU 扩展参数时,直接调 coreutils 的外部命令。二者互补,而不是互相替代。
1.3 Fresh 在整套方案里的位置
Fresh 是干什么的?简单说,它是一个“配置文件管理器”,让你把.nushell、config.nu、env.nu这一类 dotfile 纳入版本管理和一键安装流程。它原本主要是给 fish shell 用的,但设计上跟 Nushell 也不冲突——你完全可以用 Fresh 来管理 Nushell 的配置目录。
Fresh 的核心价值不是某个功能点,而是把配置的“状态”固化了。你换了新电脑、装完 Windows Terminal,只要跑一遍fresh install,就能把之前的 Nushell 配置、coreutils 环境变量、Windows Terminal 配色方案全部恢复到位。这在日常开发中非常省心,也避免了“配了半天环境,重装一次全完蛋”的灾难。
2. 核心细节解析与实操要点
2.1 Nushell 的 config.nu 与 env.nu 到底该怎么改
装好 Nushell 之后,第一次进入会有默认配置。你执行config nu或config env,它会打开对应的配置路径,通常是%APPDATA%\nushell\config.nu。这两个文件的分工,我的理解是:
env.nu管“环境变量”,比如 PATH、PROMPT 相关的变量,以及你自定义的一些环境信息;config.nu管“壳行为”,比如 prompt 显示格式、默认的 ls 布局、别名、快捷键、主题等。
实战中我建议两个文件分开管理:环境变量统一在env.nu里设置,Shell 行为统一在config.nu里设置。不要混杂,否则后期维护会非常痛苦。
举个例子,添加 cargo 的二进制目录到 PATH,可以在env.nu里写:
$env.PATH = ($env.PATH | prepend 'C:\Users\你的用户名\.cargo\bin')这个写法和常规 shell 的export PATH=/xxx:$PATH逻辑一致,但 Nushell 的写法是把 PATH 当成一个列表来处理,用prepend或append在头部或尾部追加路径。这种明确的“头/尾”操作,比字符串拼接安全得多,不会出现重复路径或格式错误。
在config.nu里,最常用的设置是 prompt。我把它改成简洁模式,显示当前目录和 Git 分支:
$env.PROMPT_COMMAND = {|| let branch = (git branch --show-current 2> /dev/null | str trim) if ($branch | is-empty) { $"($env.PWD | path basename)> " } else { $"($env.PWD | path basename) [($branch)]> " } }注意这里我把“输出重定向”写成了2> /dev/null,这在 Nushell 里是支持的。如果你在 Windows 上还没装 coreutils,这个命令里的git也需要提前装好并加入 PATH。这个 prompt 的好处是:当前目录只显示最后一级,不刷屏;有 Git 分支显示分支名,没有就保持干净。
2.2 coreutils 的安装与 PATH 细节
在 Windows 上装 coreutils,我建议不要手动去下载零散的 exe 文件,而是通过包管理器统一安装。Windows 上有几个选择:Scoop、Chocolatey、winget。我个人的偏好是 Scoop,因为它在“用户态安装、不需要管理员权限、目录整洁”这几方面表现非常好。
你可以这样安装一套 coreutils 和常用工具:
scoop install coreutils scoop install grep sed awk scoop install gzip tar scoop install git装完之后,Scoop 会把 exe 链接到~/scoop/shims目录,这个目录默认就在 PATH 里。需要注意的是,coreutils 的ls、cat这些命令可能在 Windows 上与原生命令或别名冲突。比如 Nushell 自己有ls,它会优先用内建命令,不会冲突;但如果某些工具或脚本在外部调用了dir,Windows 原生的dir依然在路径里,不会受影响。
还有一个细节:coreutils 的rm默认行为和 Windows 的del不同。coreutils 的rm -rf可以递归删除文件夹,而 Windows 的rmdir /s /q写起来非常繁琐。在 Nushell 里,我习惯直接用内建rm -r,或者显式调用 coreutils 的rm -rf。别小看这个差异,如果你写过跨平台脚本,就知道这能省多少事。
2.3 Fresh 的安装与配置管理
Fresh 的安装方式官方文档里有,核心是一段安装脚本。装好后,你会有一个~/.fresh目录,下面放你的 dotfiles 仓库,然后通过fresh install把这些配置链接到对应位置。
我喜欢的做法是:
- 在 GitHub 上建一个私有仓库,比如
dotfiles; - 在仓库里按目录组织:
nushell/config.nunushell/env.nuwindowsterminal/settings.jsonfresh/fresh.rc
Fresh 会读取一个fresh.rc或者install.conf类似的文件,里面配置“哪个源文件要链接到哪个目标位置”。安装时,Fresh 会创建符号链接或复制文件,完成一次性的环境恢复。
这里有个重要提醒:符号链接在 Windows 上有时需要开发者模式或管理员权限。如果 Fresh 创建链接失败,最简单的退路是让 Fresh 走“复制文件”模式,虽然实时同步差一点,但至少环境能恢复。我自己用得比较顺手的是“复制”,因为配置文件我改得不频繁,每次改完直接提交到 Git,换新机器再fresh install一次就行。
3. 实操过程与核心环节实现
3.1 完整安装流程:从零到可用的终端套装
下面是我在全新 Windows 机器上完整搭一套环境的步骤,你可以直接照着操作。
第一步,装 Windows Terminal。如果你用的是 Windows 11,它基本自带;如果是 Windows 10,建议去微软商店安装最新版。Windows Terminal 不是必需依赖,但它的多标签、快捷键、背景图、主题配置体验,比老款 conhost 好太多,值得装。
第二步,装 Scoop:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser irm get.scoop.sh | iex执行完会自动安装 Scoop,并把相关目录加入用户 PATH。
第三步,装 Nushell 和 coreutils 工具:
scoop install nushell coreutils grep sed awk git这里我把 git 也一并装好,因为后续 Fresh 和 Nushell 的 prompt 都会用到。
第四步,进入 Nushell:
nu第一次进入会生成默认配置目录,通常位于C:\Users\你的用户名\AppData\Roaming\nushell。
第五步,启动 Fresh。如果 Fresh 装好了,执行:
fresh install它会根据你仓库里的fresh.rc把配置链接到目标位置。如果你还没创建仓库,可以先在本地初始化一个目录,提交后再跑fresh install。
第六步,重启 Windows Terminal,把默认 shell 改成 Nushell。在 Windows Terminal 的设置里添加一个新配置项,commandline 填nu.exe的完整路径,一般用scoop which nu或where.exe nu查一下。然后设为默认。
至此,一套最基础的组合就位了。你打开 Windows Terminal,进入 Nushell,执行ls,看到的是表格样式的文件列表,执行ps,看到的是结构化进程视图。coreutils 的外部命令也可以随时调用。
3.2 常见配置片段与逻辑说明
分享几个我反复使用的 Nushell 配置片段,每个都带注释,方便你理解为什么这么写。
首先是快捷别名。Nushell 的别名和 PowerShell 不太一样,它是“命令级别”的简化:
alias ll = ls -la alias gt = git status alias ga = git add . alias gc = git commit -m alias gp = git push alias gl = git log --oneline --graph --decorate --all这些别名能让你在 Nushell 里保持和 Linux 下几乎一样的 Git 操作节奏。我在 Linux 上用的就是这套缩写,到了 Windows 一点没变,体验无缝衔接。
其次是按键绑定。Windows Terminal 本身已经提供了一些快捷键,Nushell 里也可以通过$env.config的keybindings来配置。不过实际使用下来,我建议这部分优先用 Windows Terminal 的全局快捷键,比如复制粘贴、新标签页、切换窗格,避免两边定义冲突,调试起来麻烦。
第三是颜色主题。Nushell 默认主题在 Windows Terminal 下显示还可以,但我更喜欢稍微调低高亮色饱和度,避免长时间看终端眼睛累。在config.nu里找到theme或colors配置,把table边框和header的颜色调成更柔和的灰蓝系。这部分没有标准答案,按个人喜好来。
3.3 Fresh 管理的具体配置示例
我举一个配置示例结构,方便你做参考:
dotfiles/ ├─ nushell/ │ ├─ config.nu │ └─ env.nu ├─ windowsterminal/ │ └─ settings.json └─ fresh.rcfresh.rc内容类似:
link nushell/config.nu ~/.config/nushell/config.nu link nushell/env.nu ~/.config/nushell/env.nu link windowsterminal/settings.json ~/AppData/Local/Packages/Microsoft.WindowsTerminal_8wekyb3d8bbwe/LocalState/settings.json注意:Windows Terminal 的settings.json路径在系统更新后可能变化。如果不是很确定,直接在运行目录里打开“设置”,看看 JSON 文件的位置即可。我在实际使用中,反而更建议把 Windows Terminal 的配置交给系统自动管理,不需要纳入 Fresh。还是那句话,Fresh 主要管 Nushell 的配置就够了,别把所有东西都塞进一套方案里,否则维护成本反而上升。
4. 常见问题与排查技巧实录
4.1 问题:Nushell 提示符路径中文乱码或显示异常
我在中文目录名的项目里遇到过几次 prompt 显示乱码。Nushell 默认 UTF-8,但 Windows 控制台如果代码页不对,中文字符会出现“锟斤拷”式乱码。
解决办法有两步:第一,在 Windows Terminal 的默认配置文件里,把“命令行”前的“使用旧版控制台”之类选项关掉,确保终端环境是 ConPTY 模式;第二,在env.nu里显式设置编码:
$env.LANG = "zh_CN.UTF-8" $env.UTF8_OUTPUT = "1"如果还不够,可以在启动 Nushell 时执行chcp 65001切换代码页。这个操作在 Windows Terminal 里能正常生效。
4.2 问题:Nushell 和 coreutils 的命令参数冲突
Nushell 内建的ls、cp等命令,参数风格和 GNU coreutils 不一样。比如 Nushell 的ls默认直接输出表格,不需要-l;coreutils 的ls则延续 Unix 风格。一开始很容易混用,结果发现命令行为不符合预期。
我的经验是:给 Nushell 内建命令和外部的 coreutils 命令建立一个“命名边界”。内建命令尽量用别名包裹,比如把 Nushell 的ls保留为默认表格视图,外部ls则通过^ls调用(Nushell 里^前缀表示强制调用外部程序)。例如:
alias lsf = ^ls -la --color=never这样你想要类 Unix 输出时,用lsf;想要结构化表格时,直接用ls。两者互不干扰,心里也清楚。
4.3 问题:Fresh 链接失败或提示权限不足
Fresh 在 Windows 上创建符号链接时,最常见的错误是“无法创建符号链接,你不是开发者模式”。这是因为 Windows 对创建符号链接有权限限制。
两种解法:
- 开启开发者模式。在“设置 → 隐私和安全性 → 开发者选项”里打开“开发人员模式”,这样当前用户可以创建符号链接。
- 修改 Fresh 配置,把
link改成copy或merge模式。Fresh 应该支持不同的链接策略,走复制文件的方式不需要特殊权限。
我个人用的是方案二,简单直接。因为配置文件不常改,复制文件完全够用,还避免了符号链接在不同目录层级上可能产生的路径问题。
4.4 问题:终端启动速度变慢
Nushell 启动本身很快,但如果你在env.nu里做了大量 PATH 操作、加载了很多模块,启动时间会逐渐增加。我遇到过从 100ms 涨到 400ms 的情况,排查下来是加载了一个不必要的 Starship prompt 模块和一堆自动补全插件。
优化思路很简单:
- 去掉不用的自动补全插件。Nushell 自身的补全已经足够好用;
- PATH 操作尽量合并;不要在
env.nu里频繁重复prepend同一个路径,用if $env.PATH | where ... | is-empty这类判断去重; - 延迟加载重量级工具。比如某些 SDK 的初始化脚本,不要每次启动都执行,改成手动命令或按需加载。
4.5 问题:coreutils 命令找不到或者版本老
如果你用 Scoop 安装,默认会拿到当时最新版本。找不到某个工具时,先用scoop search 工具名看有没有对应包,然后scoop install 名称安装。Scoop 的部分包在mainbucket,部分在extrasbucket,安装前先看提示是否需要添加 bucket。
版本老的问题比较少见,但如果遇到某个工具在 Windows 上出现兼容性问题,可以试试安装 GNU 官方发布的 MSYS2 版本,或者直接从各大开源项目 release 页面下载静态编译版本。Windows 环境里“同一个命令有多个发行版”是常态,我还是建议统一走包管理器,别手动乱扔,否则 PATH 顺序真是个灾难。
5. 额外提升:让 Windows Terminal 更像“开发工作台”
5.1 自定义快捷键与布局
Windows Terminal 的快捷键配置我很喜欢,因为它不止是“打开新标签页”这么简单。你可以在settings.json里定义:
- 分屏快捷键:比如
Ctrl+Shift+1左右分屏,Ctrl+Shift+2上下分屏; - 切换主题快捷键:在日常炫酷主题和护眼主题之间一键切换;
- 复制粘贴快捷键,我自定义为
Ctrl+C/Ctrl+V,和命令行习惯一致,避免和 Nushell 的内部快捷键冲突。
这些配置在 Windows Terminal 的图形设置界面里也能做,但直接改 JSON 更快,而且能跟配置文件一起管理。
5.2 背景图与透明效果
有人觉得终端带背景图和透明效果花里胡哨,但实际对长时间编码的舒适度有帮助。我喜欢设置一张深色调、低对比度的背景图,再打开亚克力透明效果,代码区域的辨识度更高。
注意:背景图不要选太花哨的,会影响阅读;透明效果也不要开满,否则多标签切换时文字重影。Windows Terminal 的透明度建议维持在 70%-85% 之间,字体选择上偏好 Nerd Font 或 CaskaydiaCove Nerd Font,对 Powerline 符号和 Git 分支符号支持很完整。
5.3 和 WSL 的共存方式
虽然我推荐的主力 shell 是 Nushell,但还是会保留一个 WSL 发行版,偶尔跑 Linux 专属工具。Windows Terminal 可以同时配置多个 shell 标签页,所以两者并不冲突。Nushell 里调用 WSL 命令可以用wsl 命令前缀,比如wsl ls -la /mnt/c/...,这样就能在 Windows 侧文件系统里享受一部分 Linux 工具链。
有一个使用细节:跨文件系统之间的 IO 性能比较差,如果你要频繁操作 Linux 侧的文件,还是在 WSL 里做更合适。Nushell 更适合 Windows 原生的文件操作、日志分析、进程管理、JSON/YAML 数据加工这类工作。
6. 该套装最适合谁、可以怎么扩展
6.1 适合的人群与场景
- 日常使用 Windows 做 Web 开发、后端开发,需要在终端里折腾 Git、Docker、Node、Python 等项目工具的人;
- 做 DevOps 或运维,习惯在 Linux 服务器上使用
grep、awk、sed等命令,但本地电脑是 Windows,需要“本地体验接近远程服务器”的人; - 重视配置管理、不想每次换电脑都重新配一遍环境的人。
6.2 可以扩展的方向
- Starship prompt:如果你对默认 prompt 的显示不满意,可以引入 Starship 作为跨 shell 统一的提示符。Starship 在 Nushell 下需要额外配置,但效果很好,能显示 Git 状态、Python 虚拟环境、Node 版本等。
- Carapace 补全:Nushell 的补全系统很灵活,还可以用 Carapace 为外部命令生成补全规则。
- Docker 容器里的 Nushell:如果你经常在容器里调试,也可以把 Nushell 装进容器,让开发环境、构建环境、线上环境的 shell 操作逻辑统一起来。
- Nushell 脚本化日常运维:我不用额外写 Python 脚本处理文本,Nushell 的数据帧操作和内置 CSV/JSON 解析已经能满足大部分需求。比如解析一个日志文件,过滤出关键字段,聚合统计,一段管道命令就能完成。
7. 结语与我的实际操作体会
说点实在的。我用了这个套装大半年,最直观的变化是:我在 Windows 上打开终端的频率变高了,愿意在终端里做的事情变多了。以前很多操作宁可打开编辑器界面点来点去,也不想面对 PowerShell 那一堆别别扭扭的语法;现在不管是处理文件、分析日志、还是做 Git 操作,都更倾向于直接开终端敲命令。
Fresh 这个工具,彻底解决了“配置文件丢失”的焦虑。我把 Nushell 的配置放在 Git 仓库里,每次修改后提交,换电脑或同步到另一台 Windows 机器时,一条命令恢复完整环境。coreutils 的存在,则让 Nushell 在应对“非结构化文本”时也不心虚,毕竟这类场景在真实开发中永远都在。
最后分享一个小技巧:不要让“配置”成为新的负担。这套套装的价值是让你更好地完成开发任务,而不是让你沉迷在调 prompt、换主题、装插件的无限折腾里。我的原则是:配置只解决“反复出现的不顺手”,一次只动一个点,稳定运行后再考虑下一个优化。
愿你也能在 Windows 上找到属于自己的终端节奏,不再为了“环境不好用”而分心。干活,才是终极目的。