返回更新列表
新发布Aug 30, 2026

nushell v0.115.0

一种新型Shell

分享

Nushell

Crates.io Build Status Nightly Build Discord The Changelog #363 GitHub commit activity GitHub contributors

一种新型的 shell。

Example of nushell

目录

状态

本项目已达到最小可行产品(MVP)级别的质量。许多人将其作为日常使用的 shell,但对于某些命令可能仍不稳定。随着 Nu 的成熟,其设计可能会发生变化。

了解 Nu

Nushell 手册 是 Nushell 文档的主要来源。你可以在手册中找到 Nu 命令的完整列表,并且我们的 cookbook 中有许多使用 Nu 的示例。

我们也活跃在 Discord 上;欢迎来和我们交流!

安装

快速安装 Nu:

# Linux and macOS
brew install nushell
# Windows
winget install nushell

要在 GitHub Action 中使用 Nu,请查看 setup-nu 了解更多详情。

详细的安装说明可以在 手册的安装章节 中找到。Nu 可通过多种包管理器获取:

Packaging status

关于 Nushell 团队积极支持哪些平台的详细信息,请参阅 我们的平台支持政策。

配置

默认配置可以在 sample_config 中找到, 这是首次启动 Nushell 时获得的配置文件。

它设置了运行 Nushell 的所有默认配置。从这里开始,你可以 根据自己的具体需求自定义此文件。

要查看 config.nu 在系统上的位置,只需输入以下命令。

$nu.config-path

请参阅我们的 手册 获取所有 Nushell 文档。

设计理念

Nu 从 PowerShell、函数式编程语言和现代 CLI 工具等项目中汲取灵感。 Nu 不将文件和数据视为原始文本流,而是将每个输入视为具有结构的东西。 例如,当你列出一个目录的内容时,返回的是一个行表格,其中每一行代表该目录中的一个项目。 这些值可以通过一系列步骤进行管道传递,这些步骤在一系列称为“管道”的命令中执行。

管道

在 Unix 中,通常会在命令之间进行管道传递,以将复杂的命令拆分为多个步骤。 Nu 更进一步,在 管道 的概念上进行了大量构建。 与 Unix 哲学一样,Nu 允许命令输出到 stdout 并从 stdin 读取。 此外,命令还可以输出结构化数据(你可以将其视为第三种流)。 在管道中工作的命令属于以下三类之一:

  • 产生流的命令(例如 ls)
  • 过滤流的命令(例如 where type == "dir")
  • 消费管道输出的命令(例如 table)

命令之间用管道符号(|)分隔,表示管道从左向右流动。

ls | where type == "dir" | table
# => ╭────┬──────────┬──────┬─────────┬───────────────╮
# => │ #  │   name   │ type │  size   │   modified    │
# => ├────┼──────────┼──────┼─────────┼───────────────┤
# => │  0 │ .cargo   │ dir  │     0 B │ 9 minutes ago │
# => │  1 │ assets   │ dir  │     0 B │ 2 weeks ago   │
# => │  2 │ crates   │ dir  │ 4.0 KiB │ 2 weeks ago   │
# => │  3 │ docker   │ dir  │     0 B │ 2 weeks ago   │
# => │  4 │ docs     │ dir  │     0 B │ 2 weeks ago   │
# => │  5 │ images   │ dir  │     0 B │ 2 weeks ago   │
# => │  6 │ pkg_mgrs │ dir  │     0 B │ 2 weeks ago   │
# => │  7 │ samples  │ dir  │     0 B │ 2 weeks ago   │
# => │  8 │ src      │ dir  │ 4.0 KiB │ 2 weeks ago   │
# => │  9 │ target   │ dir  │     0 B │ a day ago     │
# => │ 10 │ tests    │ dir  │ 4.0 KiB │ 2 weeks ago   │
# => │ 11 │ wix      │ dir  │     0 B │ 2 weeks ago   │
# => ╰────┴──────────┴──────┴─────────┴───────────────╯

因为大多数时候你会想查看管道的输出,所以 table 是默认假定的。 我们也可以这样写上面的内容:

ls | where type == "dir"

能够使用相同的命令并以不同的方式组合它们,是 Nu 的一个重要理念。 例如,我们可以使用内置的 ps 命令获取正在运行的进程列表,使用与上面相同的 where。

ps | where cpu > 0
# => ╭───┬───────┬──────┬───────────┬──────┬─────────┬───────┬────────────┬──────────╮
# => │ # │  pid  │ ppid │   name    │ user │ status  │  cpu  │  cpu_time  │   mem    │
# => ├───┼───────┼──────┼───────────┼──────┼─────────┼───────┼────────────┼──────────┤
# => │ 0 │  2240 │ 9872 │ Slack.exe │ dev  │ Running │ 16.40 │ 1min 12sec │ 178.3 MB │
# => │ 1 │ 16948 │ 9872 │ Slack.exe │ dev  │ Running │ 16.32 │      48sec │ 205.0 MB │
# => │ 2 │ 17700 │ 4632 │ nu.exe    │ dev  │ Running │  3.77 │       2sec │  26.1 MB │
# => ╰───┴───────┴──────┴───────────┴──────┴─────────┴───────┴────────────┴──────────╯

打开文件

Nu 可以将文件和 URL 内容加载为原始文本或结构化数据(如果它能识别该格式)。 例如,你可以将 .toml 文件加载为结构化数据并进行探索:

open Cargo.toml
# => ╭──────────────────┬────────────────────╮
# => │ bin              │ [table 1 row]      │
# => │ dependencies     │ {record 25 fields} │
# => │ dev-dependencies │ {record 8 fields}  │
# => │ features         │ {record 10 fields} │
# => │ package          │ {record 13 fields} │
# => │ patch            │ {record 1 field}   │
# => │ profile          │ {record 3 fields}  │
# => │ target           │ {record 3 fields}  │
# => │ workspace        │ {record 1 field}   │
# => ╰──────────────────┴────────────────────╯

我们可以将其管道传递给一个命令,以获取其中某一列的内容:

open Cargo.toml | get package
# => ╭───────────────┬────────────────────────────────────╮
# => │ authors       │ [list 1 item]                      │
# => │ default-run   │ nu                                 │
# => │ description   │ A new type of shell                │
# => │ documentation │ https://www.nushell.sh/book/       │
# => │ edition       │ 2018                               │
# => │ exclude       │ [list 1 item]                      │
# => │ homepage      │ https://www.nushell.sh             │
# => │ license       │ MIT                                │
# => │ metadata      │ {record 1 field}                   │
# => │ name          │ nu                                 │
# => │ repository    │ https://github.com/nushell/nushell │
# => │ rust-version  │ 1.60                               │
# => │ version       │ 0.72.0                             │
# => ╰───────────────┴────────────────────────────────────╯

如果需要,我们还可以进一步深入:

open Cargo.toml | get package.version
# => 0.72.0

插件

Nu 支持为 shell 提供额外功能的插件,并遵循内置命令使用的相同结构化数据模型。在 crates/nu_plugins_* 目录中有一些示例。

插件是位于你的路径中并遵循 nu_plugin_* 命名约定的二进制文件。 这些二进制文件通过简单的 JSON-RPC 协议与 nu 交互,命令在其中标识自身并传递其配置,使其可供使用。 如果插件是过滤器,数据会一次一个元素地流式传输给它,并且它可以通过 stdin/stdout 流式返回数据。 如果插件是接收器(sink),它会被赋予最终数据的完整向量,并可以自由地使用 stdin/stdout 做任何它想做的事情。

awesome-nu 仓库 列出了各种 nu 插件,而 showcase 仓库 展示 了关于 Nushell 的信息性博客文章,以及突出技术主题的视频 演讲。

目标

Nu 严格遵循一组构成其设计理念的目标。随着功能的添加,它们会根据这些目标进行检查。

  • 首先也是最重要的,Nu 是跨平台的。命令和技术应能跨平台工作,Nu 对 Windows、macOS 和 Linux 提供一等支持。

  • Nu 确保与现有平台特定可执行文件的兼容性。

  • Nu 的工作流和工具应具有 2022 年(及以后)现代软件所期望的可用性。

  • Nu 将数据视为结构化或非结构化。它是一个像 PowerShell 一样的结构化 shell。

  • 最后,Nu 以函数式方式看待数据。管道不是使用可变状态,而是作为加载、更改和保存数据的手段。

官方支持

请提交 issue 或 PR 以添加到此列表。

分类