一种新型的 shell。

本项目已达到最小可行产品(MVP)级别的质量。许多人将其作为日常使用的 shell,但对于某些命令可能仍不稳定。随着 Nu 的成熟,其设计可能会发生变化。
Nushell 手册 是 Nushell 文档的主要来源。你可以在手册中找到 Nu 命令的完整列表,并且我们的 cookbook 中有许多使用 Nu 的示例。
我们也活跃在 Discord 上;欢迎来和我们交流!
快速安装 Nu:
# Linux and macOS
brew install nushell
# Windows
winget install nushell
要在 GitHub Action 中使用 Nu,请查看 setup-nu 了解更多详情。
详细的安装说明可以在 手册的安装章节 中找到。Nu 可通过多种包管理器获取:
关于 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 以添加到此列表。