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 脚本
    • 模式匹配
    • 自定义补全器
    • 外部命令补全器
    • 模块的应用
    • 处理文件
    • Git
    • 解析 Git 日志
    • 使用 input listen 对按键进行操作
    • HTTP
    • Direnv
    • ssh-agent
    • 高级表格工作流
    • Polars vs Pandas vs Nushell
    • jq vs Nushell

模块的应用

将文件转储到目录

传统 shell 中的一个常见模式是将文件转储到目录并自动加载(例如,加载自定义补全)。在 Nushell 中,直接这样做目前还不可能,但仍然可以使用目录模块。

这里我们将创建一个简单的补全模块,其中包含一个专门用于某些 Git 补全的子模块:

  1. 创建补全目录

    mkdir ($nu.default-config-dir | path join completions)

  2. 为其创建一个空的 mod.nu

    touch ($nu.default-config-dir | path join completions mod.nu)

  3. 将以下代码片段放入 completions 目录下的 git.nu 文件中

    export extern main [
        --version(-v)
        -C: string
        # ... 等等
    ]
    
    export extern add [
        --verbose(-v)
        --dry-run(-n)
        # ... 等等
    ]
    
    export extern checkout [
        branch: string@complete-git-branch
    ]
    
    def complete-git-branch [] {
        # ... 列出 git 分支的代码
    }
  4. 将 export module git.nu 添加到 mod.nu

  5. 在 env.nu 中将 completions 目录的父目录添加到你的 NU_LIB_DIRS 中

    $env.NU_LIB_DIRS = [
        ...
        $nu.default-config-dir
    ]
  6. 在 config.nu 中导入补全到 Nushell:

    use completions *

现在你已经设置了一个可以放置补全文件的目录,下次启动 Nushell 时应该会有一些 Git 补全。

注意

这将使用文件名(在我们的示例中为 git.nu 中的 git)作为模块名称。这意味着如果定义中包含基本命令名称,某些补全可能无法工作。 例如,如果你在 git.nu 中将我们的已知外部命令定义为 export extern 'git push' [] 等,并遵循其余步骤,你将得到像 git git push 等子命令。 你需要调用 use completions git * 来获得所需的子命令。因此,使用上面步骤中概述的 main 是定义子命令的首选方式。

覆层和"虚拟环境"

覆层是 层 的 定义 。我们可以利用它来建立一个临时的虚拟环境,其中包含自定义环境变量,最后再丢弃这些变量。

我们在这个示例中的目标是:

  • 从名为 env.json 的文件激活一组环境变量
  • 在此上下文中工作
  • 丢弃环境 - 恢复原始环境

首先,让我们准备一个 env.json 用于测试:

{ A: 1 B: 2 } | save env.json

$env.A = 'zzz'

print $"('A' in $env) ('B' in $env)"
# => true false

现在让我们创建一个带有 load 命令的 env 模块,该命令从 env.json 加载环境,并将其用作覆层:

'export def --env load [] { open env.json | load-env }' | save env.nu

overlay use ./env.nu

overlay list
# => ╭───┬──────╮
# => │ 0 │ zero │
# => │ 1 │ env  │
# => ╰───┴──────╯

现在我们加载 env.json 文件:

load

print $"($env.A) ($env.B)"
# => 1 2

要隐藏覆层:

overlay hide env

print $"('A' in $env) ('B' in $env)"
# => true false

请注意 - 如覆层中所述 - 重新激活覆层将恢复加载的环境变量, 只要 Nushell 会话保持活动状态,就不会创建新的上下文,尽管 overlay list 不再列出覆层。

更多相关信息,特别是关于环境变量及其修改的信息,可以在环境、模块、覆层中找到, 以及相应的命令文档:def --env、export def --env、load-env 和 export-env。

复杂的虚拟环境

这种覆盖环境的方法可用于限定更复杂的虚拟环境,包括更改 PATH 环境变量,或在环境变量或文件中定义的其他工具设置。

像 conda 或 Python virtualenv 这样的工具管理和隔离环境变量集。 官方 virtualenv 集成利用了这些概念。 我们的 nu_scripts 仓库有一个非官方的 Conda 模块。

在GitHub上编辑此页面
Contributors: voyage200🍬
Prev
外部命令补全器
Next
处理文件