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 中的一个常见任务是控制外部应用程序将使用的环境变量。这通常是自动完成的,因为环境被打包,并在外部应用程序启动时提供给它。但有时,我们希望更精确地控制一个应用程序看到的环境变量。

你可以通过 $env 变量查看当前的环境变量:

$env | table -e
# => ╭──────────────────────────────────┬───────────────────────────────────────────╮
# => │                                  │ ╭──────┬────────────────────────────────╮ │
# => │ ENV_CONVERSIONS                  │ │      │ ╭─────────────┬──────────────╮ │ │
# => │                                  │ │ PATH │ │ from_string │ <Closure 32> │ │ │
# => │                                  │ │      │ │ to_string   │ <Closure 34> │ │ │
# => │                                  │ │      │ ╰─────────────┴──────────────╯ │ │
# => │                                  │ │      │ ╭─────────────┬──────────────╮ │ │
# => │                                  │ │ Path │ │ from_string │ <Closure 36> │ │ │
# => │                                  │ │      │ │ to_string   │ <Closure 38> │ │ │
# => │                                  │ │      │ ╰─────────────┴──────────────╯ │ │
# => │                                  │ ╰──────┴────────────────────────────────╯ │
# => │ HOME                             │ /Users/jelle                              │
# => │ LSCOLORS                         │ GxFxCxDxBxegedabagaced                    │
# => | ...                              | ...                                       |
# => ╰──────────────────────────────────┴───────────────────────────────────────────╯

在 Nushell 中,环境变量可以是任何值,并且有任何类型。你可以使用 describe 命令查看环境变量的类型,例如:$env.PROMPT_COMMAND | describe。

要将环境变量发送到外部应用程序,需要将值转换为字符串。有关其工作原理,请参阅环境变量转换。

环境最初是由 Nu 的配置文件和 Nu 的运行环境创建的。

设置环境变量

有几种方法可以设置环境变量:

$env.VAR 赋值

使用 $env.VAR = "val" 是最直接的方法:

$env.FOO = 'BAR'

因此,如果你想扩展 Windows 的 Path 变量,你可以这样做:

$env.Path = ($env.Path | prepend 'C:\path\you\want\to\add')

在这里,我们把指定文件夹前置添加到Path中的现有路径中,所以它将有最高的优先级。 如果你想给它最低的优先级,你可以使用append命令。

load-env

如果你有一个以上的环境变量需要设置,你可以使用load-env并创建一个键/值对表格,以用于加载多个环境变量:

load-env { "BOB": "FOO", "JAY": "BAR" }

一次性环境变量

这些变量被定义为只在执行代码块的过程中临时有效。 详情请看一次性环境变量。

调用def --env定义的命令

详情见从自定义命令中定义环境。

使用模块导出

参见模块部分了解更多详情。

读取环境变量

单个环境变量是记录的一个字段,存储在 $env 变量中,可以用 $env.VARIABLE 读取:

$env.FOO
# => BAR

有时,你可能想访问一个可能未设置的环境变量。考虑使用问号操作符来避免错误:

$env.FOO | describe
# => Error: nu::shell::column_not_found
# =>
# =>   × Cannot find column
# =>    ╭─[entry #1:1:1]
# =>  1 │ $env.FOO
# =>    · ──┬─ ─┬─
# =>    ·   │   ╰── cannot find column 'FOO'
# =>    ·   ╰── value originates here
# =>    ╰────

$env.FOO? | describe
# => nothing

$env.FOO? | default "BAR"
# => BAR

或者,你可以使用 in 来检查环境变量是否存在:

$env.FOO
# => BAR

if "FOO" in $env {
    echo $env.FOO
}
# => BAR

大小写敏感性

无论操作系统如何,Nushell 的 $env 都是不区分大小写的。尽管 $env 的行为很像一个记录,但它的特殊之处在于它在读取或更新时会忽略大小写。这意味着,例如,你可以使用 $env.PATH、$env.Path 或 $env.path 中的任何一个,它们在任何操作系统上都以同样的方式工作。

如果你想以区分大小写的方式读取 $env,请使用 $env | get --sensitive。

作用域

当你设置环境变量时,它将只在当前作用域内可用(变量所在的块和它里面的任何块)。

这里有一个小例子来演示环境变量作用域:

$env.FOO = "BAR"
do {
    $env.FOO = "BAZ"
    $env.FOO == "BAZ"
}
# => true
$env.FOO == "BAR"
# => true

另请参阅:在自定义命令中更改环境。

目录切换

Shell 中常见的任务是用cd命令来改变目录。 在 Nushell 中,调用cd等同于设置PWD环境变量。 因此,它遵循与其他环境变量相同的规则(例如,作用域)。

一次性环境变量

在 Bash 和其他软件的启发下,有一个常用的简便方法,可以设置一次性环境变量:

FOO=BAR $env.FOO
# => BAR

你也可以使用with-env来更明确地做同样的事情:

with-env { FOO: BAR } { $env.FOO }
# => BAR

with-env命令将暂时把环境变量设置为给定的值(这里:变量 "FOO" 被赋为 "BAR" 值)。一旦这样做了,块 将在这个新的环境变量设置下运行。

永久性环境变量

你也可以在启动时设置环境变量,使它们在 Nushell 运行期间都可用。 要做到这一点,请在 Nu 配置文件 中设置一个环境变量。 比如:

# In config.nu
$env.FOO = 'BAR'

环境变量转换

你可以通过设置ENV_CONVERSIONS环境变量,来在字符串和值之间转换其他环境变量。 例如,默认环境配置包括将PATH(和 Windows 上使用的Path)环境变量从一个字符串转换为一个列表。 在 env.nu 和 config.nu 配置文件加载后,任何在ENV_CONVERSIONS内指定的现有环境变量将根据其from_string字段被转换为任何类型的值。 外部工具要求环境变量是字符串,因此,任何非字符串的环境变量需要先进行转换: 值->字符串的转换由ENV_CONVERSIONS的to_string字段设置,每次运行外部命令时都会进行转换。

让我们用一个例子来说明转换的情况。 把以下内容放在你的config.nu中:

$env.ENV_CONVERSIONS = {
    # ... you might have Path and PATH already there, add:
    FOO : {
        from_string: { |s| $s | split row '-' }
        to_string: { |v| $v | str join '-' }
    }
}

现在,在一个 Nushell 实例内执行:

with-env { FOO : 'a-b-c' } { nu }  # runs Nushell with FOO env. var. set to 'a-b-c'

$env.FOO
# =>   0   a
# =>   1   b
# =>   2   c

你可以看到$env.FOO现在是一个新的 Nushell 实例中的列表,配置已经更新。 你也可以通过以下方式手动测试转换:

do $env.ENV_CONVERSIONS.FOO.from_string 'a-b-c'

现在,为了测试列表->字符串的转换,运行:

nu -c '$env.FOO'
# => a-b-c

因为nu是一个外部程序,Nushell 根据ENV_CONVERSIONS.FOO.to_string翻译了 [ a b c ] 列表,并把它传递给nu进程。 用nu -c运行命令不会加载配置文件,因此FOO的环境转换没有了,它被显示为一个普通的字符串 —— 这样我们可以验证转换是否成功。 你也可以通过do $env.ENV_CONVERSIONS.FOO.to_string [a b c]手动运行这个步骤。

(重要! 环境转换字符串->值发生在 env.nu 和 config.nu 被运行之后。env.nu 和 config.nu 中的所有环境变量仍然是字符串,除非你手动将它们设置为一些其他的值。)

删除环境变量

只有当一个环境变量被设置在当前作用域中时,你才能通过 hide-env 命令“删除”它:

$env.FOO = 'BAR'
# => ...
hide-env FOO

隐藏也是有作用域的,这既允许你暂时删除一个环境变量,又可以防止你从子作用域内修改父环境:

$env.FOO = 'BAR'
do {
  hide-env FOO
  # $env.FOO does not exist
}
$env.FOO
# => BAR
在GitHub上编辑此页面
Contributors: Ibraheem Ahmed, Justin Ma, amtoine, AntoineStevan, Dan Davison, Hofer-Julian, petrisch, arnau, Jan Klass, 0x4D5352, hank20010209, voyage200🍬
Prev
配置
Next
标准输入、输出和退出码