Nushell 2026 完整指南:把数据当数据处理的现代 Shell
如果你还在用 Bash 处理 JSON、CSV 或者系统日志,那你可能正在用锤子做手术刀的工作。传统的 Unix Shell 设计于 1970 年代,那时数据主要是纯文本。但 2026 年的世界,数据是结构化的 —— JSON API、CSV 导出、数据库查询结果,全都是表格和记录。
Nushell 就是为这个时代而生的 Shell。它不是另一个花哨的主题或提示符增强器,而是一个范式转变:把数据当数据处理,而不是文本。
什么是 Nushell?¶
Nushell(简称 nu)是一个现代 Shell,由前 Facebook 工程师 Jonathan Turner 创建。它的核心理念很简单但革命性:
- 结构化输出:每个命令输出都是结构化数据(表格、列表、记录),不是纯文本
- 类型安全:Shell 理解数据类型,字符串、整数、日期、文件大小都有明确类型
- 跨平台:原生支持 Windows、macOS、Linux,无需 WSL 或 Cygwin
- Rust 编写:性能优秀,内存安全,单二进制部署
截至 2026 年 3 月,Nushell 已经发布到 0.111.0 版本,GitHub 星标超过 35,000+,成为增长最快的 Shell 项目之一。
为什么你需要 Nushell?¶
传统 Shell 的痛点¶
在 Bash 中处理结构化数据是什么样的?
# 从 JSON 中提取特定字段?需要 jq
curl -s https://api.example.com/users | jq '.[] | select(.active==true) | .name'
# 统计 CSV 中某列的平均值?需要 awk
cat data.csv | awk -F',' 'NR>1 {sum+=$3; count++} END {print sum/count}'
# 列出大于 100MB 的文件并排序?管道地狱
ls -lh | awk '$5 ~ /M/ {print $0}' | sort -k5 -h
每个任务都需要不同的工具,管道里充满了 awk、sed、grep、jq 的混合体。错误处理?类型转换?祝你好运。
Nushell 的方式¶
# 同样的任务,统一的语法
# JSON API 查询
http get https://api.example.com/users | where active == true | select name
# CSV 数据分析
open data.csv | math avg --columns price
# 文件过滤和排序
ls | where size > 100MB | sort-by size
看到区别了吗?一致的语法,结构化的数据流,无需外部工具。
安装 Nushell¶
Linux (推荐方式)¶
# 使用官方安装脚本
curl --proto '=https' --tlsv1.2 -sSf https://www.nushell.sh/install.sh | sh
# 或使用包管理器
# Ubuntu/Debian
cargo install nu
# Arch Linux
yay -S nushell
# Fedora
sudo dnf install nushell
macOS¶
# Homebrew
brew install nushell
# MacPorts
sudo port install nushell
Windows¶
# Winget (Windows 10/11)
winget install nushell
# Chocolatey
choco install nushell
# Scoop
scoop install nushell
验证安装¶
nu --version
# 输出:nu 0.111.0
核心概念:从文本到数据¶
1. 表格是第一公民¶
在 Nushell 中,ls 不再输出文本行,而是返回表格:
ls
# ╭───┬──────────────────┬──────┬────────┬───────────────╮
# │ # │ name │ type │ size │ modified │
# ├───┼──────────────────┼──────┼────────┼───────────────┤
# │ 0 │ docs │ dir │ 4.0KB │ 10 minutes ago│
# │ 1 │ README.md │ file │ 2.3KB │ 2 hours ago │
# │ 2 │ package.json │ file │ 1.1KB │ 1 day ago │
# ╰───┴──────────────────┴──────┴────────┴───────────────╯
这是一个真正的表格对象,你可以:
# 过滤
ls | where type == file
# 选择列
ls | select name size
# 排序
ls | sort-by size -r
# 获取特定行
ls | get 0.name
2. 数据类型系统¶
Nushell 理解并尊重数据类型:
# 数字运算
echo 10 + 5 # 15 (整数)
echo 3.14 * 2 # 6.28 (浮点数)
# 字符串操作
echo "hello" | str length # 5
echo "Hello World" | str downcase # hello world
# 日期处理
date now
date now | format date "%Y-%m-%d"
date now - date "2026-01-01" # 显示天数差
# 文件大小(自动转换)
echo 1GB / 1MB # 1024
3. 管道传递的是值,不是文本¶
这是最关键的差异。在 Bash 中:
# 文本流,每个命令都要解析文本
ls -l | grep ".md" | awk '{print $9}'
在 Nushell 中:
# 结构化数据流,保持类型信息
ls | where name =~ ".md" | get name
实战:数据管道示例¶
示例 1:分析 GitHub 仓库信息¶
# 获取仓库数据并分析
http get https://api.github.com/repos/nushell/nushell \
| select stargazers_count forks_count open_issues language \
| flatten
示例 2:处理 CSV 销售数据¶
假设你有一个 sales.csv:
date,product,amount,region
2026-01-01,Widget A,1500,North
2026-01-02,Widget B,2300,South
2026-01-03,Widget A,1800,North
# 读取并分析
open sales.csv \
| where region == "North" \
| group-by product \
| each { |it|
{
product: $it.product.0,
total: ($it | get amount | math sum),
count: ($it | length)
}
}
示例 3:系统监控仪表板¶
# 创建系统状态报告
{
hostname: (sys host | get name),
uptime: (sys host | get uptime),
memory: {
total: (sys mem | get total),
free: (sys mem | get free),
percent_used: ((sys mem | get total) - (sys mem | get free)) / (sys mem | get total) * 100
},
disk: (sys disks | select name mount total free |
insert percent_used { |it| (($it.total - $it.free) / $it.total * 100) | math round })
}
示例 4:批量重命名文件¶
# 将所有 .jpeg 文件重命名为 .jpg
ls *.jpeg \
| each { |it|
mv $it.name ($it.name | str replace ".jpeg" ".jpg")
}
2026 新特性亮点¶
Nushell 0.110.0 和 0.111.0 带来了重大改进:
1. 管道中的 let 命令¶
现在可以在管道中间定义变量:
ls
| let total = (length)
| let files = (where type == file | length)
| echo $"Total: ($total), Files: ($files)"
2. 命令组别名¶
减少输入,提高效率:
# 定义别名组
alias gs = git status
alias ga = git add
alias gc = git commit
# 或使用命令组
def "git s" [] { git status }
def "git a" [] { git add }
3. 增强的 finally 支持¶
确保清理代码总是执行:
try {
open data.json | process
} catch { |err|
echo $"Error: ($err)"
} finally {
echo "Cleanup complete"
}
4. Polars 插件集成¶
大数据处理性能提升:
# 使用 Polars 插件处理大型 CSV
polars open large_dataset.csv
| polars filter (polars col "amount" > 1000)
| polars group-by "region"
| polars agg (polars col "amount" | polars agg sum)
配置和定制¶
配置文件位置¶
# 配置文件
~/.config/nushell/config.nu
# 环境变量
~/.config/nushell/env.nu
# 历史记录
~/.local/share/nushell/history.txt
基本配置示例¶
# config.nu
# 设置编辑器
$env.EDITOR = "nvim"
# 自定义提示符
def create_prompt [] {
let path = (pwd | path basename)
$"[($path)]> "
}
$env.PROMPT_COMMAND = { create_prompt }
# 启用语法高亮
use ~/.config/nushell/plugins/gghid.nu *
有用的别名¶
# 添加到 config.nu
alias ll = ls -l
alias la = ls -a
alias lg = ls | grep
alias rm = rm -i # 安全删除
# Git 快捷方式
alias gs = git status
alias ga = git add
alias gc = git commit -m
alias gp = git push
性能对比¶
根据 2026 年的基准测试:
| 任务 | Bash + 工具 | Nushell |
|---|---|---|
| JSON 解析 | jq + 管道 | 原生 (快 3 倍) |
| CSV 处理 | awk/csvkit | 原生 (快 2 倍) |
| 文件过滤 | find + grep | ls + where (相当) |
| 启动时间 | ~10ms | ~50ms |
| 内存占用 | ~5MB | ~15MB |
Nushell 的启动稍慢,但复杂数据处理任务中表现更优,因为减少了外部进程调用。
学习资源¶
- 官方文档 - 完整的入门指南和参考
- Nushell GitHub - 源码和 issue 追踪
- Nushell Blog - 最新版本发布和功能更新
- Discord 社区 - 活跃的社区支持
- 示例 cookbook - 实用代码片段
何时使用 Nushell?¶
✅ 适合的场景¶
- 处理 JSON、CSV、YAML 等结构化数据
- 构建数据管道和 ETL 流程
- 跨平台脚本开发
- API 数据获取和处理
- 系统管理和监控任务
⚠️ 需要谨慎的场景¶
- 现有 Bash 脚本迁移(需要重写)
- 极度性能敏感的循环(启动开销)
- 依赖特定 Shell 行为的生产环境
- 与旧工具链深度集成的系统
总结¶
Nushell 代表了 Shell 设计的未来方向。它不是要完全替代 Bash(系统脚本还是需要 POSIX 兼容性),而是为现代开发任务提供了一个更强大的交互式和脚本环境。
关键优势:
- 🎯 结构化数据优先 — 不再需要
jq、awk、sed的混合体 - 🔒 类型安全 — 减少脚本错误和意外行为
- 🚀 跨平台一致 — 同一脚本在所有平台运行
- 📦 单二进制部署 — 无需依赖,易于分发
- 🛠️ 活跃开发 — 2026 年持续更新,社区增长迅速
如果你经常处理 API、数据文件,或者只是想要一个更现代化的命令行体验,Nushell 值得投入时间学习。
开始使用:安装后运行 nu 进入交互模式,或执行 nu script.nu 运行脚本。官方教程是最佳起点。