Nushell
安装 Nu !
快速开始
  • Nushell 之书
  • 命令参考列表
  • 实战指南
  • 语言参考指南
  • 贡献指南
博客
  • English
  • 中文
  • Deutsch
  • Français
  • Español
  • 日本語
  • Português do Brasil
  • Русский язык
GitHub
安装 Nu !
快速开始
  • Nushell 之书
  • 命令参考列表
  • 实战指南
  • 语言参考指南
  • 贡献指南
博客
  • English
  • 中文
  • Deutsch
  • Français
  • Español
  • 日本語
  • Português do Brasil
  • Русский язык
GitHub
  • 简介
  • 安装
    • 默认 Shell
  • 快速入门
    • 快速入门
    • 在系统中四处移动
    • 用 Nu 的方式思考
    • Nushell 速查表
  • Nu 基础篇
    • 数据类型
    • 加载数据
    • 管道
    • 处理字符串
    • 处理列表
    • 处理记录(Records)
    • 处理表格
    • 导航和访问结构化数据
    • 特殊变量
  • Nushell 编程
    • 自定义命令
    • 别名
    • 运算符
    • 变量
    • 控制流
    • 脚本
    • 模块
      • 使用模块
      • 创建模块
    • 覆层
    • 排序
    • 测试你的 Nushell 代码
    • 最佳实践
  • Nu 作为 Shell 使用
    • 配置
    • 环境
    • 标准输入、输出和退出码
    • 运行系统(外部)命令
    • 如何配置第三方提示
    • 目录栈
    • Reedline,Nu 的行编辑器
    • 自定义补全
    • 外部命令
    • Nu 的配色和主题
    • 钩子
    • 后台任务
  • 迁移到 Nu
    • 从 Bash 到 Nu
    • 从 CMD.EXE 到 Nu
    • 从其他 Shell 或 DSL 到 Nu
    • 从命令式语言到 Nu
    • 从函数式语言到 Nu
    • Nushell 运算符
  • 设计说明
    • Nushell代码执行原理
  • (不怎么)高级篇
    • 标准库 (预览版)
    • Dataframes
    • 元数据
    • 创建你自己的错误
    • 并行
    • 插件
    • explore

快速入门

  • Nushell 命令输出 数据
  • 对数据进行操作
  • 不仅仅是目录
  • 管道中的命令参数
  • 获取帮助
  • 开始 explore(浏览) 这里

Nushell 命令输出 数据

了解 Nu 功能的最简单方法就是看一些例子,让我们开始吧。

当你运行像 ls 这样的命令时,你会注意到的第一件事是,返回的不是一个文本块,而是一个结构化的表格。

ls
# => ╭────┬─────────────────────┬──────┬───────────┬──────────────╮
# => │  # │        name         │ type │   size    │   modified   │
# => ├────┼─────────────────────┼──────┼───────────┼──────────────┤
# => │  0 │ CITATION.cff        │ file │     812 B │ 2 months ago │
# => │  1 │ CODE_OF_CONDUCT.md  │ file │   3.4 KiB │ 9 months ago │
# => │  2 │ CONTRIBUTING.md     │ file │  11.0 KiB │ 5 months ago │
# => │  3 │ Cargo.lock          │ file │ 194.9 KiB │ 15 hours ago │
# => │  4 │ Cargo.toml          │ file │   9.2 KiB │ 15 hours ago │
# => │  5 │ Cross.toml          │ file │     666 B │ 6 months ago │
# => │  6 │ LICENSE             │ file │   1.1 KiB │ 9 months ago │
# => │  7 │ README.md           │ file │  12.0 KiB │ 15 hours ago │
# => ...

这个表格不仅仅是漂亮地格式化了输出。就像电子表格一样,它允许我们交互式地处理数据。

对数据进行操作

接下来,让我们按每个文件的大小对这个表进行排序。为此,我们将获取 ls 的输出,并将其输入到一个可以根据列中的值对表进行排序的命令中。

ls | sort-by size | reverse
# => ╭───┬─────────────────┬──────┬───────────┬──────────────╮
# => │ # │      name       │ type │   size    │   modified   │
# => ├───┼─────────────────┼──────┼───────────┼──────────────┤
# => │ 0 │ Cargo.lock      │ file │ 194.9 KiB │ 15 hours ago │
# => │ 1 │ toolkit.nu      │ file │  20.0 KiB │ 15 hours ago │
# => │ 2 │ README.md       │ file │  12.0 KiB │ 15 hours ago │
# => │ 3 │ CONTRIBUTING.md │ file │  11.0 KiB │ 5 months ago │
# => │ 4 │ ...             │ ...  │ ...       │ ...          │
# => │ 5 │ LICENSE         │ file │   1.1 KiB │ 9 months ago │
# => │ 6 │ CITATION.cff    │ file │     812 B │ 2 months ago │
# => │ 7 │ Cross.toml      │ file │     666 B │ 6 months ago │
# => │ 8 │ typos.toml      │ file │     513 B │ 2 months ago │
# => ╰───┴─────────────────┴──────┴───────────┴──────────────╯

请注意,我们没有向 ls 传递命令行参数或开关。相反,我们使用 Nushell 的内置命令 sort-by 来对 ls 命令的输出进行排序。然后,为了让最大的文件显示在最上面,我们对 sort-by 的输出使用了 reverse。

酷!

如果你仔细比较排序顺序,你可能会发现数据不是按字母顺序排序的,甚至不是按数值排序的。相反,由于 size 列是 filesize 类型,Nushell 知道 1.1 KiB (kibibytes) 比 812 B (bytes) 大。

使用 where 命令查找数据

Nu 提供了许多可以对前一个命令的结构化输出进行操作的命令。这些在 Nushell 中通常被归类为“过滤器”。

例如,我们可以使用 where 来过滤表格的内容,使其只显示大于 10 KB 的文件:

ls | where size > 10kb
# => ╭───┬─────────────────┬──────┬───────────┬───────────────╮
# => │ # │      name       │ type │   size    │   modified    │
# => ├───┼─────────────────┼──────┼───────────┼───────────────┤
# => │ 0 │ CONTRIBUTING.md │ file │  11.0 KiB │ 5 months ago  │
# => │ 1 │ Cargo.lock      │ file │ 194.6 KiB │ 2 minutes ago │
# => │ 2 │ README.md       │ file │  12.0 KiB │ 16 hours ago  │
# => │ 3 │ toolkit.nu      │ file │  20.0 KiB │ 16 hours ago  │
# => ╰───┴─────────────────┴──────┴───────────┴───────────────╯

不仅仅是目录

当然,这并不仅限于 ls 命令。Nushell 遵循 Unix 的哲学,即每个命令都只做好一件事,你通常可以期望一个命令的输出成为另一个命令的输入。这使我们能够以许多不同的组合来混合和匹配命令。

让我们看看另一个命令:

ps
# => ╭───┬──────┬──────┬───────────────┬──────────┬──────┬───────────┬─────────╮
# => │ # │ pid  │ ppid │     name      │  status  │ cpu  │    mem    │ virtual │
# => ├───┼──────┼──────┼───────────────┼──────────┼──────┼───────────┼─────────┤
# => │ 0 │    1 │    0 │ init(void)    │ Sleeping │ 0.00 │   1.2 MiB │ 2.2 MiB │
# => │ 1 │    8 │    1 │ init          │ Sleeping │ 0.00 │ 124.0 KiB │ 2.3 MiB │
# => │ 2 │ 6565 │    1 │ SessionLeader │ Sleeping │ 0.00 │ 108.0 KiB │ 2.2 MiB │
# => │ 3 │ 6566 │ 6565 │ Relay(6567)   │ Sleeping │ 0.00 │ 116.0 KiB │ 2.2 MiB │
# => │ 4 │ 6567 │ 6566 │ nu            │ Running  │ 0.00 │  28.4 MiB │ 1.1 GiB │
# => ╰───┴──────┴──────┴───────────────┴──────────┴──────┴───────────┴─────────╯

你可能熟悉 Linux/Unix 的 ps 命令。它提供了系统中所有当前正在运行的进程及其当前状态的列表。与 ls 一样,Nushell 提供了一个跨平台的内置 ps 命令,它以结构化数据的形式返回结果。

注

传统的 Unix ps 默认只显示当前进程及其父进程。Nushell 的实现默认显示系统上的所有进程。

通常情况下,在 Nushell 中运行 ps 会使用其 内部的 、跨平台的命令。但是,在 Unix/Linux 平台上,仍然可以通过在命令前加上脱字符号来运行 外部的 、依赖于系统的版本。例如:

^ps aux  # 运行 Unix ps 命令,以面向用户的形式显示所有进程

更多细节请参见运行外部系统命令。

如果我们只想显示正在活跃运行的进程怎么办?与上面的 ls 一样,我们也可以处理 ps 输出的表格:

ps | where status == Running
# => ╭───┬──────┬──────┬──────┬─────────┬──────┬──────────┬─────────╮
# => │ # │ pid  │ ppid │ name │ status  │ cpu  │   mem    │ virtual │
# => ├───┼──────┼──────┼──────┼─────────┼──────┼──────────┼─────────┤
# => │ 0 │ 6585 │ 6584 │ nu   │ Running │ 0.00 │ 31.9 MiB │ 1.2 GiB │
# => ╰───┴──────┴──────┴──────┴─────────┴──────┴──────────┴─────────╯

提示

还记得上面 ls 命令输出的 size 列是 filesize 类型吗?在这里,status 实际上只是一个字符串,你可以对它使用所有常规的字符串操作和命令,包括(如上所示)== 比较。

你可以使用以下命令检查表格列的类型:

ps | describe
# => table<pid: int, ppid: int, name: string, status: string, cpu: float, mem: filesize, virtual: filesize> (stream)

describe 命令可以用来显示任何命令或表达式的输出类型。

管道中的命令参数

有时,命令接受的是参数而不是管道输入。对于这种情况,Nushell 提供了 $in 变量,让你可以在变量形式中使用前一个命令的输出。例如:

ls
| sort-by size
| reverse
| first
| get name
| cp $in ~

Nushell 设计说明

只要有可能,Nushell 命令都会被设计为对管道输入进行操作。然而,有些命令,比如本例中的 cp,有两个(或更多)具有不同含义的参数。在这种情况下,cp 需要同时知道要复制的路径和目标路径。因此,这个命令使用两个位置参数会更符合人体工程学。

提示

为了可读性,Nushell 命令可以跨越多行。上面的命令与下面这个相同:

ls | sort-by size | reverse | first | get name | cp $in ~

另请参阅:多行编辑

前三行与我们在上面第二个例子中使用的命令相同,所以让我们来看看后三行:

  1. first 命令只是从表格中返回第一个值。在这种情况下,这意味着大小最大的文件。如果使用上面第二个例子中的目录列表,那就是 Cargo.lock 文件。这个“文件”是表格中的一个 record(记录),它仍然包含 name、type、size 和 modified 列/字段。
  2. get name 从前一个命令返回 name 字段的值,即 "Cargo.lock"(一个字符串)。这也是一个 cell-path(单元格路径)的简单例子,可用于导航和隔离结构化数据。
  3. 最后一行使用 $in 变量来引用第 5 行的输出。结果是一个命令,意思是*“将 'Cargo.lock' 复制到主目录”*

提示

get 和它的对应命令 select 是 Nushell 中最常用的两个过滤器,但乍一看可能不容易发现它们之间的区别。当你准备好更广泛地使用它们时,请参阅使用 get 和 select指南。

获取帮助

Nushell 提供了一个广泛的、内置的帮助系统。例如

# help <command>
help ls
# 或者
ls --help
# 也可以
help operators
help escapes

酷!

按 F1 键访问帮助菜单。在这里搜索 ps 命令,但先不要按 Enter 键!

相反,按 向下箭头 键,你会发现你正在滚动浏览示例部分。高亮一个示例,然后按 Enter 键,该示例将被输入到命令行中,准备运行!

这是探索和学习大量 Nushell 命令的好方法。

帮助系统还有一个“搜索”功能:

help --find filesize
# 或
help -f filesize

现在你可能不会感到惊讶,帮助系统本身就是基于结构化数据的!请注意,help -f filesize 的输出是一个表格。

每个命令的帮助都作为一条记录存储,包含:

  • 名称
  • 类别
  • 类型(内置、插件、自定义)
  • 接受的参数
  • 显示其可接受和输出的数据类型的签名
  • 等等

你可以使用以下命令将所有命令(外部命令除外)看作一个大表格:

help commands

提示

请注意,上面输出的 params 和 input_output 列是嵌套表。Nushell 允许任意嵌套的数据结构。

开始 explore(浏览) 这里

help commands 的输出很长。你可以把它发送到像 less 或 bat 这样的分页器中,但 Nushell 包含一个内置的 explore 命令,它不仅可以让你滚动,还可以深入到嵌套数据中。试试:

help commands | explore

然后按 Enter 键访问数据本身。使用箭头键滚动到 cp 命令,再到 params 列。再次按 Enter 键可以深入查看 cp 命令可用的完整参数列表。

注

按一次 Esc 键从滚动模式返回到视图;再按一次则返回到上一个视图(如果已在顶层视图,则退出)。

提示

当然,你可以在 Nushell 中对 任何 结构化数据使用 explore 命令。这可能包括来自 Web API 的 JSON 数据、电子表格或 CSV 文件、YAML,或任何可以在 Nushell 中表示为结构化数据的东西。

试试 $env.config | explore 玩玩吧!

在GitHub上编辑此页面
Contributors: voyage200🍬
Next
在系统中四处移动