Nushell-好玩的彩色终端

Nushell 评测:当 shell 开始认真对待”数据”

评测环境:Windows 10 (19045) · Nushell 0.116.1 · Git Bash 作为对照组
所有命令与输出都是本机实跑结果,不是抄文档。

一、先说结论

一句话:Nushell 不是”更好看的 bash”,它是把 shell 的管道从”字节流”升级成了”带类型的表格”。

它解决的是我这类人长期的隐性痛点——为了在命令行里处理点数据,不得不在 awk、sed、jq、cut、sort 之间反复试错,还要和引号、空格、中文、WSL 路径打架。

我的主观评分:

维度评分说明
数据处理能力9.5/10结构化管道,扁平化处理 JSON/CSV/TOML/XLSX/SQLite
报错体验9/10会指出位置、猜你想打的命令,还带 help 建议
交互体验8.5/10表格输出、explore、自动补全、语法高亮
上手成本5/10语法是新的,bash 直觉一半会失效
生态成熟度7/10533 个内置命令,插件体系有了,但第三方脚本少
POSIX 兼容2/10基本没有,脚本不能直接跑

适合谁:经常在终端里摸文件的、写数据脚本的、被 jq 语法折腾过的、Windows 用户。
不适合谁:维护一堆 bash 部署脚本的运维、需要严格 POSIX 的 CI 环境。

二、第一印象:它真的很”彩色”

打开就发现,ls 不再是白色一坨:

注意这里发生了三件在 bash 里根本做不到的事:

  1. size 是真的数值,可以 sort-by size -r 直接排序,不用 du -sh | sort -h
  2. select 是在取列,不是 awk '{print $1,$2}'
  3. 输出是表格(可读性来自渲染,底层还是结构化数据)

复杂嵌套的结构也能渲染:

三、核心差异:管道里传的是”值”,不是”文本”

这是整个 Nushell 的设计基石,也是我留下它的唯一理由。

3.1 一切都有类型

describe 会告诉你手上这坨东西到底是什么。ls 返回的不是字符串行,而是 table —— 列名和类型都写在类型里。

于是 filesize、datetime、duration 是真类型:

在 bash 里算时间差得靠 date +%s 两次相减再手算格式化,这里直接减。

3.2 一个真实抓取,一行搞定

http get 直接返回解析后的 JSON 值,不用 curl ... | jq -r '.stargazers_count',也不用担心响应里有没有换行。抓取时间 2026-11-08,star 已经四万出头了。

3.3 分组聚合不用背 awk 语法

keyrows
a[{k: a, v: 1}, {k: a, v: 2}]
b[{k: b, v: 3}]

同样的活在 bash 里我要 awk '{a[$1]+=$2} END{for(i in a) print i,a[i]}',而且处理不了带空格的值。

3.4 文件格式全部扁平化

读 Excel 都行(open 表格.xlsx 走 from xlsx),这在我日常里是刚需——以前要么开 Excel,要么写 Python。

连 SQLite 都有:

into sqlite 把表格写进库,open 自动识别库,query db 直接跑 SQL。这就是把”数据处理”当一等公民的样子。

四、报错体验:目前最好的一档

我故意打错一个命令:

它做了四件事:告诉你错误分类(external_command)、画出精确位置、解释原因、给出修正建议。这比 bash 的 command not found 高了一个时代。

类型不匹配也说得清清楚楚:

(顺带一提,这个报错帮我发现了 sys 返回的是 lazy record,得用 sys host | to md 而不是 sys host | columns。)

五、能自定义命令,而且写法像正经语言

  • $"..." 是插值字符串,($name) 求值
  • 参数有类型(name: string)
  • flag 用 --loud,自动变成 bool
  • if/else 是表达式,能返回值

还能给命令声明输入输出类型,管道里加列:

$in 是隐式管道输入,insert 是加列,闭包 {|r| ...} 拿整行。这套东西的可组合性,比我写过的任何 shell 脚本都好。

5.1 并行是真的并行

8 个 200ms 的任务,总共 204ms —— par-each 确实在并行。bash 想做到这个要么 & + wait 自己管,要么写 GNU parallel 语法。

六、实战:用它管这个博客目录

这个目录有 6 篇 md,我拿它当小白鼠:

中文文件名、kB 单位、相对时间(”5 days ago”)全部原生支持,没出一次编码问题。** 递归 + get 取列 + math sum 求和,一条链到底,中间不需要任何管道工具。

顺手还能看机器状态:

七、踩坑记录(真实踩出来的,不粉饰)

这部分比优点更值得看。以下每一条我都实际撞过。

坑 1:&& 不存在

要写 and / or。好处是报错明确告诉你不行,不会像某些 shell 那样静默出错。

坑 2:外部命令的输出是 byte stream

bash 里 git log 的输出天然是”按行”,Nushell 里它是原始字节流。要按行处理必须 lines。^ 前缀是”强制当外部命令跑”(因为 ls、cd 这些名字被内置命令占了)。

这一点是新手最大的认知落差,我第一次写 | where $it =~ ... 直接不工作就是因为忘了 lines。

坑 3:命令会被弃用,而且要盯着警告

str upcase 在 0.114 弃用了。1.0 还没发就一步步改 API,说明迭代很快 —— 好处是设计越来越干净,坏处是你收藏的博客教程可能已经过时。写脚本时最好照着 help <命令> 来,而不是搜出来的旧文章。

坑 4:布尔开关不能带类型注解

--loud 本身就是 bool,写 : bool 是错的。报错把怎么改都写了,还算友好。

坑 5:不要给 def 随便标 table

裸 table 作为类型名不匹配。要么省略注解靠推断,要么写完整 list>。类型系统很爽,但也真会卡你。

坑 6:Windows 下递归 glob 会撞权限

从 C:\Users\xxx 根上递归扫,必然遇到系统保护目录。有意思的是它不中断,而是把错误当成列表项返回 —— 设计上很”结构化”(错误是值),实际用起来会有点懵。

正确姿势:进到具体目录里再递归,或者过滤掉错误项。

坑 7:脚本不会逐行回显

"b" 被丢掉了。Nushell 的脚本块是块求值(只返回最后表达式的值),不像 bash 每条命令都往 stdout 打。想输出就 print。

写文件也别用 >:

(顺带:save 不加换行,hiyo 会粘在一起。)

坑 8:bash 脚本基本不能直接搬

老的 .sh 一行都别想复用。要跑老的:

坑 9:$env.PATH 是 list,不是字符串

这其实比 bash 的 : 拼接合理得多,但你以前那些 export PATH=$PATH:xxx 的写法全部作废,得用 $env.PATH ++ 。

坑 10:插件与格式支持按 feature 编译

parquet 需要额外插件/feature,不是开箱即用。explore(交互式数据浏览器)是有的,这点好评:

八、横向对比

bashzshfishPowerShellNushell
管道传什么文本文本文本对象带类型的表格
处理 JSON靠 jq靠 jq靠 jqConvertFrom-Json原生,直接取列
报错质量差差中好好(带定位+建议)
补全/高亮弱强(插件)强强强
POSIX 兼容是是否否否
学新语法成本—低低高高
启动开销极低低低高低

启动开销我实测了一下(Windows,各跑 5 次取总):

只差十几毫秒,日常无感。但如果是每行都 fork 一次的脚本循环,这个差距会被放大 —— 所以别拿 nu 写高频循环的批处理。

九、我的迁移建议

如果你也想试,我建议按这个顺序,别一上来就换默认 shell:

第 1 周:只当”数据工具”

不换默认 shell,专门用它干这些活:

第 2 周:把常用脚本搬过来

to md 直接吐 Markdown 表格,粘进 Obsidian 就能用 —— 这个组合我个人用得最多。

第 3 周:决定要不要设成默认

Windows 上设默认 shell 参考:

配置在 $nu.config-path(我这里是 C:\Users\Zhu HuiChen\AppData\Roaming\nushell\config.nu),环境变量在 env.nu。

我自己的选择:不设成默认。Git Bash 留着跑构建和 sh 脚本,Nushell 专门用来”看东西、查数据、写一次性分析脚本”。两个 shell 各干各擅长的,比强行二选一舒服。

十、最后

Nushell 让我改观的地方,不是”终端变彩色了”这种表面功夫(虽然它确实好看,"hello" | ansi gradient 能玩出真彩色渐变),而是它承认了 shell 里 90% 的操作本质是数据处理,然后把这件事做对了:

  • 有类型 → 不再有”这列是数字还是字符串”的玄学
  • 有结构 → 不再有空格/引号/分隔符地狱
  • 有好的报错 → 不用靠搜索引擎猜自己错在哪

代价同样明确:语法不兼容、生态还小、教程易过时。它是个”要下决心学”的工具,不是”装上就能用”的工具。

但如果你每天有半小时在命令行里和 JSON、CSV、日志、文件列表搏斗,那这半小时值得投资。

评分:8.7 / 10 —— 值得装,值得学,暂时别急着替掉 bash。


参考

参与讨论