当了十年程序员,第一次见把Shell做成这样的
当了十年程序员,第一次见把Shell做成这样的
命令行工具几十年没怎么变过。ls 列出文件,grep 搜索文本,awk 处理字段,每个命令输出一堆纯文本,然后用管道拼在一起。这套方式从 Unix 时代沿用到现在,大多数人都习惯了。
直到看到 Nushell,一个 Github 上 39,000 多 Star 的开源项目。它的思路跟传统 Shell 不一样:命令行里的数据不再是纯文本,而是带结构的表格。

传统 Shell 的问题在哪
用过 Bash 的人都有体会。想找出当前目录下大于 1MB 的文件,得这样写:
find . -size +1M -exec ls -lh {} \;
命令长不说,find 和 ls 的输出格式还不一样,想把结果再按日期排序又得接一堆 awk、sort。
根本原因是传统 Shell 把一切都当成纯文本处理。ls 输出是文本,grep 输出是文本。想从 ls 的输出里取"文件大小"这一个字段?只能靠 awk 按空格切割,祈祷格式别变。
Nushell 的做法:一切皆表格
Nushell 的思路来自 PowerShell,但用起来更顺手。它把命令的输出当作结构化的表格,每一列都有名字和类型。比如 ls 列出来的不是纯文本,而是一个包含 name、type、size、modified 字段的表格。
想筛选出目录?直接用 where 过滤:
ls | where type == "dir"
想看 CPU 占用超过 0 的进程?
ps | where cpu > 0
同一个 where 命令,既可以用在 ls 上,也可以用在 ps 上。因为它操作的是结构化数据,不是字符串。这个区别是本质上的。
打开文件像查数据库
Nushell 的 open 命令能识别文件格式,把内容直接解析成结构化数据。打开一个 TOML 配置文件:
open Cargo.toml
输出是一个可折叠的表格,dependencies、features、package 每个段都是一个独立的列。想取出版本号:
open Cargo.toml | get package.version
一步到位。不需要 grep 再 sed 再 cut。

管道还是那个管道,但数据不一样了
Unix 管道的精神保留了下来,把命令串在一起,左进右出。区别在于管道里流动的不再是无结构的文本行,而是有类型的数据行。
Nushell 把命令分成三类:产生数据的(ls、ps、open)、过滤数据的(where、sort-by、select)、消费数据的(table、to json、save)。每类各司其职,组合方式灵活。
而且常用的管道末尾会自动带上 table 命令,把结果渲染成对齐的表格。不用像传统 Shell 那样手动 column -t。
插件机制
Nushell 支持插件,命名规则是 nu_plugin_xxx,放在 PATH 里就能用。插件跟主程序之间用 JSON-RPC 通信,数据模型跟内置命令保持一致。社区已经积累了一批插件,覆盖了数据库查询、文件处理、网络请求等方向。
另外 zoxide、starship、oh-my-posh、atuin 这些命令行工具也都官方支持了 Nushell,日常使用不会缺工具。
谁适合用
如果你每天在终端里花的时间超过两小时,Nushell 值得试一下。它在 Windows、macOS、Linux 上表现一致,安装也简单,brew install nushell 或者 winget install nushell 就行。
习惯 Bash 的人一开始会不适应。muscle memory 是 ls -la 而不是 ls | where type == "dir"。但花一两天过渡之后,回到传统 Shell 反而会觉得别扭:明明一个 where 就能解决的事,为什么要敲那么长的 awk?
Nushell 目前版本已经达到可用水平,不少人拿它当主力 Shell。部分命令可能还有不稳定的情况,毕竟是还在演进的项目。
它不是 Bash 的替代品。但如果你需要经常在命令行里处理数据和文件,它能省很多事。
浙公网安备 33010602011771号