#plugin #bash #environment #nu #nushell #record #bash-env

app nu_plugin_bash_env

Nu Bash环境插件

1 个不稳定版本

0.13.0 2024年8月22日

#4#nushell

MIT 和可能 CC-PDDC

26KB
460

nu_plugin_bash_env

Nushell的Bash环境插件。

有关如何使用此插件的说明,请参阅Nushell手册

总结,构建crate并将生成的nu_plugin_bash_env可执行文件作为插件使用plugin add添加,然后使用plugin use

对于Nix用户,现在可以将其作为flake安装(见下文)。

插件读取指定的环境文件(如果有)并从stdin(如果有)评估变量,并将任何新的或更改的环境变量作为记录返回,适合传递给Nu的load-env

插件版本兼容性

从Nushell 0.91.0开始,插件协议得到了增强,现在需要插件和Nushell本身的版本兼容性。

以下版本是兼容的。

Nushell bash-env插件
0.89 0.5.0
0.90 0.5.0
0.91 0.6.2
0.92 0.7.1
0.93 0.8.0
0.93 0.9.0
0.94 0.10.0
0.95 0.11.0
0.96 0.12.1
0.97 0.13.0

如果您发现新版本的Nushell拒绝此插件作为不兼容,请报告一个问题

依赖关系

该脚本使用jq进行输出格式化。旧版本至少需要jq版本1.7,但这可能不再适用。

我还怀疑至少需要Bash版本5.1

示例

简单用法

> bash-env tests/simple.env
╭───┬───╮
│ B │ b │
│ A │ a │
╰───┴───╯

> echo $env.A
Error: nu::shell::name_not_found

  × Name not found


> bash-env tests/simple.env | load-env

> echo $env.A
a
> echo $env.B
b


> bash-env tests/simple.env
╭──────────────╮
│ empty record │
╰──────────────╯

# no new or changed environment variables, so nothing returned

> ssh-agent | bash-env
Agent pid 98985
╭───────────────┬───────────────────────────────────╮
│ SSH_AUTH_SOCK/tmp/ssh-XXXXXXFIMT9y/agent.98982 │
│ SSH_AGENT_PID98985                             │
╰───────────────┴───────────────────────────────────╯

导出Shell变量

此插件支持--export将shell变量导出到环境变量中。

> echo "ABC=123" | bash-env
╭──────────────╮
│ empty record │
╰──────────────╯

> echo "export ABC=123" | bash-env
╭─────┬─────╮
│ ABC123 │
╰─────┴─────╯

> echo "ABC=123" | bash-env --export [ABC]
╭─────┬─────╮
│ ABC123 │
╰─────┴─────╯

> bash-env /etc/os-release
╭──────────────╮
│ empty record │
╰──────────────╯

> bash-env --export [ID PRETTY_NAME] /etc/os-release
╭─────────────┬──────────────────────╮
│ ID          │ nixos                │
│ PRETTY_NAME │ NixOS 24.05 (Uakari) │
╰─────────────┴──────────────────────╯

转义特殊字符

已注意转义任何特殊字符。

> bash-env `tests/Ming's "menu" of (merciless) monstrosities.env`
╭───────────┬──────────────────────────────────────────────────────╮
│ QUOTE"Well done!" is better than "Well said!"             │
│ SPACEMAN  │ One small step for a man ...                         │
│ MIXED_BAG │ Did the sixth sheik's sixth sheep say "baa", or not? │
╰───────────┴──────────────────────────────────────────────────────╯

> bash-env `tests/Ming's "menu" of (merciless) monstrosities.env` | load-env
> echo $env.QUOTE
"Well done!" is better than "Well said!"

实现

在0.13.0之前,此插件是用Bash编写的,通过手动使用jq完成Nu插件协议,并从包含生成所需内容的Rust程序(使用官方Nu插件库)的api子目录中汲取灵感。由于协议的演变,维护此协议过于繁琐,因此已被放弃。

从0.13.0开始,插件是用Rust编写的,其中嵌入了一个简化的Bash脚本。

默认情况下,嵌入的Bash脚本在运行时提取到临时目录。可以通过设置环境变量`NU_PLUGIN_BASH_ENV_SCRIPT`来覆盖此行为,该环境变量应解析为预安装脚本的路径。

日志记录

日志记录通过Rust的tracing-subscriber包支持,日志级别由环境变量NU_PLUGIN_BASH_ENV_LOG定义。

Nix flake

插件可以通过Nix Home Manager从其flake安装。

查看我的Home Manager flakenushell模块,了解如何实现此功能。特别注意每次插件注册的要求。

注意

脚本中的所有本地变量都以前置下划线开头,以尝试减轻Bash区分shell本地变量和环境变量的能力不足,但这绝对不是万无一失的。

未来工作

  • 取消环境变量应该可行

依赖关系

~28–59MB
~1M SLoC