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

在系统中四处移动

Shell 的一个决定性特征是能够在文件系统中导航和交互。Nushell 当然也不例外。以下是你在与文件系统交互时可能会用到的一些常用命令。

查看目录内容

ls

正如在快速入门中看到的,ls 命令返回目录的内容。Nushell 的 ls 将以表格的形式返回内容。

ls 命令还需要一个可选的参数,以改变你想查看的内容。例如,我们可以列出以 .md 结尾的文件:

ls *.md
# => ╭───┬────────────────────┬──────┬──────────┬──────────────╮
# => │ # │        name        │ type │   size   │   modified   │
# => ├───┼────────────────────┼──────┼──────────┼──────────────┤
# => │ 0 │ CODE_OF_CONDUCT.md │ file │  3.4 KiB │ 9 months ago │
# => │ 1 │ CONTRIBUTING.md    │ file │ 11.0 KiB │ 5 months ago │
# => │ 2 │ README.md          │ file │ 12.0 KiB │ 6 days ago   │
# => │ 3 │ SECURITY.md        │ file │  2.6 KiB │ 2 months ago │
# => ╰───┴────────────────────┴──────┴──────────┴──────────────╯

通配符模式 (wildcards)

上述可选参数 *.md 中的星号(*)有时被称为通配符(wildcards)或 Glob,它让我们可以匹配任何东西。你可以把 glob *.md 理解为“匹配以 .md 结尾的任何文件名”。

最通用的通配符是 *,能够匹配所有路径。它经常和其他模式(pattern)组合使用,比如 *.bak 和 temp*。

Nu 也使用双星号 **,它允许你访问更深的目录。比如,ls **/* 将递归地罗列当前目录下、所有的非隐藏路径。

ls **/*.md
# => ╭───┬───────────────────────────────┬──────┬──────────┬──────────────╮
# => │ # │             name              │ type │   size   │   modified   │
# => ├───┼───────────────────────────────┼──────┼──────────┼──────────────┤
# => │ 0 │ CODE_OF_CONDUCT.md            │ file │  3.4 KiB │ 5 months ago │
# => │ 1 │ CONTRIBUTING.md               │ file │ 11.0 KiB │ a month ago  │
# => │ 2 │ README.md                     │ file │ 12.0 KiB │ a month ago  │
# => │ 3 │ SECURITY.md                   │ file │  2.6 KiB │ 5 hours ago  │
# => │ 4 │ benches/README.md             │ file │    249 B │ 2 months ago │
# => │ 5 │ crates/README.md              │ file │    795 B │ 5 months ago │
# => │ 6 │ crates/nu-cli/README.md       │ file │    388 B │ 5 hours ago  │
# => │ 7 │ crates/nu-cmd-base/README.md  │ file │    262 B │ 5 hours ago  │
# => │ 8 │ crates/nu-cmd-extra/README.md │ file │    669 B │ 2 months ago │
# => │ 9 │ crates/nu-cmd-lang/README.md  │ file │  1.5 KiB │ a month ago  │
# => ╰───┴───────────────────────────────┴──────┴──────────┴──────────────╯

这里,我们正在寻找任何以 ".md" 结尾的文件。双星号进一步指定了“从这里开始的任何目录中”。

Nushell 的通配符语法不仅支持 *,还支持用 ? 匹配单个字符和用 [...] 匹配字符组。

通过将 *、? 和 [] 模式包含在单引号、双引号或原始字符串中,可以对它们进行转义。例如,要显示名为 [slug] 的目录的内容,请使用 ls "[slug]" 或 ls '[slug]'。

然而,反引号引用的字符串不会转义通配符。例如,比较以下场景:

  1. 未引用:通配符模式

    一个带有通配符字符的未引用的裸词字符串被解释为一个通配符模式,所以下面的命令将删除当前目录中所有文件名中包含 myfile 的文件:

    rm *myfile*
  2. 引用:带星号的字符串字面量

    当使用单引号或双引号引用,或使用原始字符串时,一个带有字面量、转义的星号(或其他通配符字符)的字符串被传递给命令。结果不是一个通配符。以下命令将只删除一个字面量名为 *myfile*(包括星号)的文件。名称中包含 myfile 的其他文件不受影响:

    rm "*myfile*"
  3. 反引号引用:通配符模式

    反引号引用的字符串中的星号(和其他通配符模式)被解释为一个通配符模式。请注意,这与上面 #1 中的裸词字符串示例的行为相同。

    以下命令与第一个示例一样,删除当前目录中所有文件名中包含 myfile 的文件:

    rm `*myfile*`

提示

Nushell 还包括一个专门的 glob 命令,支持更复杂的通配符场景。

将字符串转换为通配符

上面的引用技术在构造通配符字面量时很有用,但你可能需要以编程方式构造通配符。有几种技术可用于此目的:

  1. into glob

    into glob 命令可用于将字符串(和其他类型)转换为通配符。例如:

    # 查找文件名包含当前月份(格式为 YYYY-mm)的文件
    let current_month = (date now | format date '%Y-%m')
    let glob_pattern = ($"*($current_month)*" | into glob)
    ls $glob_pattern
  2. 扩展操作符与 glob 命令结合使用:

    glob 命令(注意:与 into glob 不同)生成一个与通配符模式匹配的列表文件名。这个列表可以使用扩展操作符展开并传递给文件系统命令:

    # 查找文件名包含当前月份(格式为 YYYY-mm)的文件
    let current_month = (date now | format date '%Y-%m')
    ls ...(glob $"*($current_month)*")
  3. 通过注解强制 glob 类型:

    # 查找文件名包含当前月份(格式为 YYYY-mm)的文件
    let current_month = (date now | format date '%Y-%m')
    let glob_pattern: glob = ($"*($current_month)*")
    ls $glob_pattern

创建目录

与大多数其他 shell 一样,mkdir 命令用于创建新目录。一个细微的区别是,Nushell 的内部 mkdir 命令默认情况下像 Unix/Linux 的 mkdir -p 一样操作,因为它:

  • 会自动创建多个目录级别。例如:

    mkdir modules/my/new_module

    即使这些目录都不存在,这也会创建所有三个目录。在 Linux/Unix 上,这需要 mkdir -p。

  • 如果目录已经存在,则不会出错。例如:

    mkdir modules/my/new_module
    mkdir modules/my/new_module
    # => 没有错误

    提示

    一个常见的错误是,刚接触 Nushell 的人会尝试使用 mkdir -p <directory>,就像在原生的 Linux/Unix 版本中一样。然而,这会在 Nushell 中产生一个 Unknown Flag 错误。

    只需重复不带 -p 的命令即可达到相同的效果。

改变当前目录

cd cookbook

要从当前目录换到一个新目录,我们使用 cd 命令。

如果 cd 被省略,只给出一个路径本身,也可以改变当前工作目录:

cookbook/

就像在其他 Shells 中一样,我们可以使用目录的名称,或者如果我们想进入父目录,我们可以使用 .. 的快捷方式。

你还可以添加额外的点来进入更上层的目录:

# 切换到父目录
cd ..
# 或者
..
# 上移两层(父目录的父目录)
cd ...
# 或者
...
# 上移三层(父目录的父目录的父目录)
cd ....
# 等等

提示

多点快捷方式可用于内部 Nushell 文件系统命令以及外部命令。例如,在 Linux/Unix 系统上运行 ^stat .... 将显示路径被扩展为 ../../..

你也可以将相对目录级别与目录名结合起来:

cd ../sibling

重要提示

用 cd 改变目录会改变 PWD 环境变量。这意味着目录的改变会保留到当前代码块(例如,块或闭包)中。一旦你退出这个代码块,你就会返回到以前的目录。你可以在环境篇中了解更多关于这方面的信息。

文件系统命令

Nu 还提供了一些可以跨平台工作的基本文件系统命令,例如:

  • mv 用于重命名或将文件或目录移动到新位置
  • cp 用于将项目复制到新位置
  • rm 用于从文件系统中删除项目

提示

在 Bash 和许多其他 shell 中,大多数文件系统命令(cd 除外)实际上是系统中的独立二进制文件。例如,在 Linux 系统上,cp 是 /usr/bin/cp 二进制文件。在 Nushell 中,这些命令是内置的。这有几个优点:

  • 它们在可能没有二进制版本的平台(例如 Windows)上工作一致。这允许创建跨平台的脚本、模块和自定义命令。
  • 它们与 Nushell 更紧密地集成,允许它们理解 Nushell 类型和其他构造。
  • 如快速入门中所述,它们在 Nushell 帮助系统中有文档记录。运行 help <command> 或 <command> --help 将显示该命令的 Nushell 文档。

虽然通常建议使用 Nushell 内置版本,但也可以访问 Linux 二进制文件。有关详细信息,请参阅运行外部命令。

在GitHub上编辑此页面
Contributors: Ibraheem Ahmed, Justin Ma, Hofer-Julian, CAESIUS-TIM, NotTheDr01ds, Chen1Plus, voyage200🍬
Prev
快速入门
Next
用 Nu 的方式思考