从 Nu 中的键/值对文件设置环境变量

Set environment variables from file of key/value pairs in Nu

提问人:NotTheDr01ds 提问时间:10/29/2023 更新时间:10/29/2023 访问量:51

问:

就像 Bash 的这个问题一样,我想要一个简单的文件或类似的文件,我可以将其读取到 Nushell 环境中。虽然我通常会将其用于 API 密钥,但只需重用该问题中的相同示例:.env

MINIENTREGA_FECHALIMITE="2011-03-31"
MINIENTREGA_FICHEROS="informe.txt programa.c"
MINIENTREGA_DESTINO="./destino/entrega-prac1"

当然,Nushell 不是 POSIX,所以这些答案都行不通。

用于设置环境变量的 Nushell 语法为:

$env.foo = "value"

虽然可以修改环境的文件,但该文件必须是有效的 Nu 脚本,但事实并非如此。source-env.env

我想保持文件的结构“标准”,以便它可以与其他 shell 和工具一起使用,但是如何使用它在 Nushell 中设置环境变量?

环境变量 nushell的

评论


答:

1赞 NotTheDr01ds 10/29/2023 #1

我尝试了几次才做对,所以把它扔掉,以防它对其他人有帮助(这样我以后就可以很容易地找到它)。我在 Nushell 中找到了两种方法来做到这一点。

视为 TOML 文件

目前的文件格式是有效的 TOML 文件,Nushell 内置了对 TOML 作为结构化数据的支持。因此,我们可以通过以下方式轻松阅读它:

> open .env | from toml

╭─────────────────────────┬─────────────────────────╮
│ MINIENTREGA_DESTINO     │ ./destino/entrega-prac1 │
│ MINIENTREGA_FECHALIMITE │ 2011-03-31              │
│ MINIENTREGA_FICHEROS    │ informe.txt programa.c  │
╰─────────────────────────┴─────────────────────────╯

从那里,由于结果是 Nushell 记录,因此可用于将其加载到环境中:load-env

> open .eenv | from toml | load-env
> echo $env.MINIENTREGA_FECHALIMITE
2011-03-31

TOML 还支持注释,因此您也可以拥有有效的 (Bash) 注释文件并忽略它们。from toml

需要注意的是,文件必须是有效的 TOML,包括引号。

或者先通过 Bash 加载它

公平的警告:我知道这看起来真的很黑客,但我已经在 Fish shell(也不是 POSIX)上成功地使用这种方法来处理 Bash 脚本几年了,它也适用于 Nushell 上的这个修改用例。

感谢这个问题的 Bash 版本的这个很好的答案

exec bash -lic "set -o allexport && source ~.env && set +o allexport; exec nu"

这:

  • execs Bash(替换当前的 Nushell)
  • 设置 Bash 选项以将所有变量导出到环境中
  • source的 .env
  • 重置选项
  • execs Nushell,取代了之前的 Bash

由于变量是从 Bash 导出的,因此它们现在将在 Nu 中可用。

  • 优点:这适用于任何 Bash/POSIX 脚本/格式。
  • 缺点:速度较慢,因为它会启动两个 shell 并在两个 shell 上处理启动文件。