
nushell v0.115.0
一种新型Shell
Nushell
一种新型的 shell。

目录
状态
该项目已达到最低可行产品的质量水平。许多人将其作为日常使用的 shell,但某些命令可能仍不稳定。随着 Nu 的成熟,其设计可能会发生变化。
了解 Nu
Nushell 书籍是 Nushell 文档的主要来源。你可以在书中找到完整的 Nu 命令列表,我们还在食谱中提供了许多使用 Nu 的示例。
我们也活跃在 Discord 上,欢迎来和我们聊天!
安装
快速安装 Nu:
# Linux 和 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 │ 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 以添加到该列表中。
- zoxide
- starship
- oh-my-posh
- Couchbase Shell
- virtualenv
- atuin
- clap
- Dorothy
- Direnv
- x-cmd
- vfox
- Windmill
- Lacy
贡献
详情请参阅贡献指南。感谢所有已经做出贡献的人!
许可证
该项目在 MIT 许可证下提供。更多信息请参阅 LICENSE 文件。