Nushell
书
Cookbook
博客
  • English
  • 中文
  • Deutsch
  • Français
  • Español
  • 日本語
  • Português do Brasil
  • Русский язык
GitHub
书
Cookbook
博客
  • English
  • 中文
  • Deutsch
  • Français
  • Español
  • 日本語
  • Português do Brasil
  • Русский язык
GitHub
  • 入门篇

    • 介绍
    • 安装 Nu
    • 以 Nushell 的方式思考
    • 在系统中四处移动
  • Nu 基础篇

    • 数据类型
    • 加载数据
    • 处理字符串
    • 处理列表
    • 处理表格
    • 管道
    • 命令索引
  • Nushell 编程

    • 自定义命令
    • 别名
    • 运算符
    • 变量和子表达式
    • 脚本
    • 模块
    • 覆层
  • Nu 作为 Shell 使用

    • 配置
    • 环境
    • 标准输入、输出和退出码
    • 转移到系统
    • 配置第三方提示
    • Shell 中的 Shell
    • Reedline,Nu 的行编辑器
    • 外部命令
    • 自定义补全
    • Nu 的配色和主题
    • 钩子
  • 迁移到 Nu

    • 从 Bash 到 Nu
    • 从其他 Shell 或 DSL 到 Nu
    • 从命令式语言到 Nu
    • 从函数式语言到 Nu
    • Nushell 运算符
  • 高级篇

    • DataFrames
    • 元数据
    • 创建你自己的错误
    • 并行
    • 插件

覆层

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

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

基础

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

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

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

    export alias bar = "bar"

    export 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
# => ───┴──────

在下面的章节中,> 的提示语前面会有最后一个活动覆层的名称。 (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 不变。

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

(zero)> overlay use spam

(spam)> overlay new scratchpad

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

保存定义

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

(zero)> overlay use spam

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

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

(zero)> eggs
eggs

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

覆层顺序

覆层被排成一个堆栈。 如果多个覆层包含相同的定义,比如 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
Prev
模块