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

覆层

覆层(Overlays)作为各种定义(自定义命令、别名、环境变量)的"层",可以根据需要激活和停用。 它们类似于某些语言中的虚拟环境,如 Python。

注意:要了解覆层,请确保先查看 模块,因为覆层是建立在模块之上的。

基础

首先,Nushell 有一个默认的覆层,叫做 zero。 你可以用 overlay list 命令检查哪些覆层是活动的。 你应该可以看到默认的覆层显示在那里。

要创建一个新的覆层,你首先需要一个模块:

module spam {
    export def foo [] {
        "foo"
    }

    export alias bar = echo "bar"

    export-env {
        load-env { BAZ: "baz" }
    }
}

我们将在本章中使用这个模块。每当你看到 overlay use spam,就应该知道 spam 是指这个模块。

提示

该模块可以通过模块中描述的三种方法中的任何一种来创建:

  • "内联"模块(本例中使用)
  • 文件
  • 目录

要创建覆层,请调用 overlay use:

overlay use spam

foo
# => foo

bar
# => bar

$env.BAZ
# => baz

overlay list
# => ───┬──────
# =>  0 │ zero
# =>  1 │ spam
# => ───┴──────

它将模块的定义带入当前作用域,并以与 use 命令相同的方式评估 export-env 代码块(参见模块章节)。

提示

在下面的章节中,> 的提示语前面会有最后一个活动覆层的名称。 (spam)> some-command 表示当输入命令时,spam 覆层是最后活动的覆层。

移除覆层

如果你不再需要叠加定义,请调用 overlay hide:

(spam)> overlay hide spam

(zero)> foo
Error: Can't run executable...

(zero)> overlay list
───┬──────
 0 │ zero
───┴──────

覆层也是有作用域的。 任何添加的覆层都会在作用域结束时被移除:

(zero)> do { overlay use spam; foo }  # 覆层仅在代码块内活动
foo

(zero)> overlay list
───┬──────
 0 │ zero
───┴──────

移除覆层的最后一种方法是调用不带参数的 overlay hide,它将删除最后一个活动的覆层。

覆层是可记录的

任何新的定义(命令、别名、环境变量)都会被记录到最后一个活动的覆层:

(zero)> overlay use spam

(spam)> def eggs [] { "eggs" }

现在,eggs 命令属于 spam 覆层。 如果我们删除该覆层,我们就不能再调用它:

(spam)> overlay hide spam

(zero)> eggs
Error: Can't run executable...

但是,我们可以把它找回来!

(zero)> overlay use spam

(spam)> eggs
eggs

覆层会记住你所添加的内容,即使你删除了它们,也会储存这些信息。 这可以让你在不同的上下文中反复切换。

提示

有时,在添加一个覆层后,你可能不希望自定义对象被添加到其中。 解决的办法是创建一个新的空的覆层,只用来记录自定义的变化:

(zero)> overlay use spam

(spam)> module scratchpad { }

(spam)> overlay use scratchpad

(scratchpad)> def eggs [] { "eggs" }

eggs 命令被添加到 scratchpad 中,同时保持 spam 不变。

为了让上述步骤不那么冗长,你可以使用 overlay new 命令:

(zero)> overlay use spam

(spam)> overlay new scratchpad

(scratchpad)> def eggs [] { "eggs" }

前缀覆层

overlay use 命令会将模块中的所有命令和别名直接放入当前命名空间。 但是,你可能希望将它们作为子命令保留在模块名称之后。 这就是 --prefix 的作用:

(zero)> module spam {
    export def foo [] { "foo" }
}

(zero)> overlay use --prefix spam

(spam)> spam foo
foo

请注意,这不适用于环境变量。

重命名覆层

你可以使用 as 关键字更改添加的覆层的名称:

(zero)> module spam { export def foo [] { "foo" } }

(zero)> overlay use spam as eggs

(eggs)> foo
foo

(eggs)> overlay hide eggs

(zero)>

如果你有一个通用的脚本名称,例如 virtualenv 的 activate.nu,但你希望为你的覆层提供一个更具描述性的名称,这可能很有用。

保留定义

有时,你可能想删除一个覆层,但保留所有你添加的自定义定义,而不必在下一个活动覆层中重新定义它们:

(zero)> overlay use spam

(spam)> def eggs [] { "eggs" }

(spam)> overlay hide --keep-custom spam

(zero)> eggs
eggs

--keep-custom 标志正是用来做这个的。

也可以使用 --keep-env 标志保留在覆层内定义的环境变量列表,但删除其余部分:

(zero)> module spam {
    export def foo [] { "foo" }
    export-env { $env.FOO = "foo" }
}

(zero)> overlay use spam

(spam)> overlay hide spam --keep-env [ FOO ]

(zero)> foo
Error: Can't run executable...

(zero)> $env.FOO
foo

覆层顺序

覆层被排成一个堆栈。 如果多个覆层包含相同的定义,比如 foo,最后一个活动的覆层将优先。 要把某个覆层放到堆栈的顶部,你可以再次调用 overlay use:

(zero)> def foo [] { "foo-in-zero" }

(zero)> overlay use spam

(spam)> foo
foo

(spam)> overlay use zero

(zero)> foo
foo-in-zero

(zero)> overlay list
───┬──────
 0 │ spam
 1 │ zero
───┴──────

现在,zero 覆层具有优先权。

在GitHub上编辑此页面
Contributors: Justin Ma, hustcer, amtoine, AntoineStevan, Jakub Žádník, Hofer-Julian, Jan Klass, 0x4D5352, voyage200🍬
Prev
模块
Next
排序