Skip to content

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

每个任务都需要不同的工具,管道里充满了 awksedgrepjq 的混合体。错误处理?类型转换?祝你好运。

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?

✅ 适合的场景

  • 处理 JSON、CSV、YAML 等结构化数据
  • 构建数据管道和 ETL 流程
  • 跨平台脚本开发
  • API 数据获取和处理
  • 系统管理和监控任务

⚠️ 需要谨慎的场景

  • 现有 Bash 脚本迁移(需要重写)
  • 极度性能敏感的循环(启动开销)
  • 依赖特定 Shell 行为的生产环境
  • 与旧工具链深度集成的系统

总结

Nushell 代表了 Shell 设计的未来方向。它不是要完全替代 Bash(系统脚本还是需要 POSIX 兼容性),而是为现代开发任务提供了一个更强大的交互式和脚本环境。

关键优势

  1. 🎯 结构化数据优先 — 不再需要 jqawksed 的混合体
  2. 🔒 类型安全 — 减少脚本错误和意外行为
  3. 🚀 跨平台一致 — 同一脚本在所有平台运行
  4. 📦 单二进制部署 — 无需依赖,易于分发
  5. 🛠️ 活跃开发 — 2026 年持续更新,社区增长迅速

如果你经常处理 API、数据文件,或者只是想要一个更现代化的命令行体验,Nushell 值得投入时间学习。


开始使用:安装后运行 nu 进入交互模式,或执行 nu script.nu 运行脚本。官方教程是最佳起点。