返回更新列表
新发布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

目录

状态

该项目已达到最低可行产品的质量水平。许多人将其作为日常使用的 shell,但某些命令可能仍不稳定。随着 Nu 的成熟,其设计可能会发生变化。

了解 Nu

Nushell 书籍是 Nushell 文档的主要来源。你可以在书中找到完整的 Nu 命令列表,我们还在食谱中提供了许多使用 Nu 的示例。

我们也活跃在 Discord 上,欢迎来和我们聊天!

安装

快速安装 Nu:

# Linux 和 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  │   name    │  cpu  │    mem    │  virtual  │
# => ├───┼───────┼───────────┼───────┼───────────┼───────────┤
# => │ 0 │  2240 │ Slack.exe │ 16.40 │ 178.3 MiB │ 232.6 MiB │
# => │ 1 │ 16948 │ Slack.exe │ 16.32 │ 205.0 MiB │ 197.9 MiB │
# => │ 2 │ 17700 │ nu.exe    │  3.77 │  26.1 MiB │   8.8 MiB │
# => ╰───┴───────┴───────────┴───────┴───────────┴───────────╯

打开文件

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_* 目录中有一些示例。

插件是位于 PATH 中的二进制文件,遵循 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 以函数式方式看待数据。管道不是使用变更(mutation),而是作为一种在无可变状态下加载、更改和保存数据的手段。

官方支持

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

贡献

详情请参阅贡献指南。感谢所有已经做出贡献的人!

许可证

该项目在 MIT 许可证下提供。更多信息请参阅 LICENSE 文件。

分类