1 个不稳定版本
新 0.13.0 | 2024年8月22日 |
---|
#4 在 #nushell
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_PID │ 98985 │
╰───────────────┴───────────────────────────────────╯
导出Shell变量
此插件支持--export
将shell变量导出到环境变量中。
> echo "ABC=123" | bash-env
╭──────────────╮
│ empty record │
╰──────────────╯
> echo "export ABC=123" | bash-env
╭─────┬─────╮
│ ABC │ 123 │
╰─────┴─────╯
> echo "ABC=123" | bash-env --export [ABC]
╭─────┬─────╮
│ ABC │ 123 │
╰─────┴─────╯
> 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 flake和nushell模块,了解如何实现此功能。特别注意每次插件注册的要求。
注意
脚本中的所有本地变量都以前置下划线开头,以尝试减轻Bash区分shell本地变量和环境变量的能力不足,但这绝对不是万无一失的。
未来工作
- 取消环境变量应该可行
依赖关系
~28–59MB
~1M SLoC