Historically Bash environment for Nushell was provided via the nu_plugin_bash_env
plugin in this repo.
That plugin is now deprecated in favour of the bash-env
module, which is more feature rich and also embarrassingly simpler than the plugin.
> bash-env ./tests/simple.env
โญโโโโฌโโโโฎ
โ B โ b โ
โ A โ a โ
โฐโโโโดโโโโฏ
> echo $env.A
Error: nu::shell::column_not_found
ร Cannot find column 'A'
โญโ[entry #77:1:6]
1 โ echo $env.A
ยท โโโโฌโโโฌ
ยท โ โฐโโ value originates here
ยท โฐโโ cannot find column 'A'
โฐโโโโ
> 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
โญโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฎ
โ SSH_AUTH_SOCK โ /tmp/ssh-XXXXXXOjZtSh/agent.1612713 โ
โ SSH_AGENT_PID โ 1612715 โ
โฐโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฏ
Rather than folding shell variables in with the environment variables as was done by the plugin, the -s
or --shellvars
option results in structured output with separate env
and shellvars
.
> echo "ABC=123" | bash-env
โญโโโโโโโโโโโโโโโฎ
โ empty record โ
โฐโโโโโโโโโโโโโโโฏ
> echo "ABC=123" | bash-env -s
โญโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโฎ
โ env โ {record 0 fields} โ
โ โ โญโโโโโโฌโโโโโโฎ โ
โ shellvars โ โ ABC โ 123 โ โ
โ โ โฐโโโโโโดโโโโโโฏ โ
โฐโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโโโฏ
> (echo "ABC=123" | bash-env -s).shellvars
โญโโโโโโฌโโโโโโฎ
โ ABC โ 123 โ
โฐโโโโโโดโโโโโโฏ
> bash-env /etc/os-release
โญโโโโโโโโโโโโโโโฎ
โ empty record โ
โฐโโโโโโโโโโโโโโโฏ
> (bash-env /etc/os-release -s).shellvars
โญโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฎ
โ LOGO โ nix-snowflake โ
โ NAME โ NixOS โ
โ BUG_REPORT_URL โ https://github.com/NixOS/nixpkgs/issues โ
โ HOME_URL โ https://nixos.org/ โ
โ VERSION_CODENAME โ vicuna โ
โ ANSI_COLOR โ 1;34 โ
โ ID โ nixos โ
โ PRETTY_NAME โ NixOS 24.11 (Vicuna) โ
โ DOCUMENTATION_URL โ https://nixos.org/learn.html โ
โ SUPPORT_URL โ https://nixos.org/community.html โ
โ IMAGE_ID โ โ
โ VERSION_ID โ 24.11 โ
โ VERSION โ 24.11 (Vicuna) โ
โ IMAGE_VERSION โ โ
โ BUILD_ID โ 24.11.20240916.99dc878 โ
โฐโโโโโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฏ
Shell functions may be run and their effect on the environment captured.
> cat ./tests/shell-functions.env
export A=1
export B=1
function f2() {
export A=2
export B=2
C2="I am shell variable C2"
}
function f3() {
export A=3
export B=3
C3="I am shell variable C3"
}
> bash-env ./tests/shell-functions.env
โญโโโโฌโโโโฎ
โ B โ 1 โ
โ A โ 1 โ
โฐโโโโดโโโโฏ
> bash-env -f [f2 f3] ./tests/shell-functions.env
โญโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฎ
โ โ โญโโโโฌโโโโฎ โ
โ env โ โ B โ 1 โ โ
โ โ โ A โ 1 โ โ
โ โ โฐโโโโดโโโโฏ โ
โ shellvars โ {record 0 fields} โ
โ โ โญโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฎ โ
โ fn โ โ โ โญโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฎ โ โ
โ โ โ f2 โ โ โ โญโโโโฌโโโโฎ โ โ โ
โ โ โ โ โ env โ โ B โ 2 โ โ โ โ
โ โ โ โ โ โ โ A โ 2 โ โ โ โ
โ โ โ โ โ โ โฐโโโโดโโโโฏ โ โ โ
โ โ โ โ โ โ โญโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโฎ โ โ โ
โ โ โ โ โ shellvars โ โ C2 โ I am shell variable C2 โ โ โ โ
โ โ โ โ โ โ โฐโโโโโดโโโโโโโโโโโโโโโโโโโโโโโโโฏ โ โ โ
โ โ โ โ โฐโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฏ โ โ
โ โ โ โ โญโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฎ โ โ
โ โ โ f3 โ โ โ โญโโโโฌโโโโฎ โ โ โ
โ โ โ โ โ env โ โ B โ 3 โ โ โ โ
โ โ โ โ โ โ โ A โ 3 โ โ โ โ
โ โ โ โ โ โ โฐโโโโดโโโโฏ โ โ โ
โ โ โ โ โ โ โญโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโฎ โ โ โ
โ โ โ โ โ shellvars โ โ C3 โ I am shell variable C3 โ โ โ โ
โ โ โ โ โ โ โฐโโโโโดโโโโโโโโโโโโโโโโโโโโโโโโโฏ โ โ โ
โ โ โ โ โฐโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฏ โ โ
โ โ โฐโโโโโดโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฏ โ
โฐโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฏ
> (bash-env -f [f2 f3] ./tests/shell-functions.env).fn.f2.env
โญโโโโฌโโโโฎ
โ B โ 2 โ
โ A โ 2 โ
โฐโโโโดโโโโฏ
> (bash-env -f [f2 f3] ./tests/shell-functions.env).fn.f2.env | load-env
> echo $env.B
2
Download the module, and add to config.nu
:
use /path/to/bash-env.nu
In contrast to the plugin, the module requires bash-env-json
to be separately downloaded and installed as an executable on the $PATH
.
The plugin is unlikely to be maintained beyond the next plugin protocol change in Nushell. It is recommended to switch to the bash-env
module instead.
For instructions on how to use this plugin, see the Nushell book.
In summary, build the crate and add the resulting nu_plugin_bash_env
executable as a plugin using plugin add
, then plugin use
.
For users of Nix, this is now installable as a flake (see below).
The plugin reads the specified environment file (if any) and evaluates variables from stdin
(if any) and returns any new or changed environment variables as a record, suitable for passing to Nu's load-env
.
Since Nushell 0.91.0 the plugin protocol was enhanced and now requires version compatability between plugins and Nushell itself.
The following versions are compatible.
Nushell | bash-env plugin |
---|---|
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 |
0.98 | 0.14.2 |
0.98 | 0.15.1 |
0.99 | 0.16.1 |
0.100 | 0.17.3 |
If you find a new version of Nushell rejects this plugin as incompatible, please report an issue.
The script uses jq
for output formatting. Previous versions required at least jq
version 1.7
, but that may be no longer the case.
Also I suspect at least Bash version 5.1
.
Since version 0.15.0
, this plugin uses bash-env-json
instead of the previously bundled bash_env.sh
script. However, this is fetched and embedded at build time, so there is no difference at runtime.
> 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 โ
โฐโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฏ
The plugin supports --export
for exporting shell variables into the environment.
> 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) โ
โฐโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโโโโโโฏ
Care has been taken to escape any special characters.
> 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!"
Prior to 0.13.0 this plugin was written in Bash, with the Nu plugin protocol done by hand using jq
, with insights from the api sub-directory which contained a Rust program to produce what is required, using the official Nu plugin library. This was too onerous to maintain through the evolution of the protocol, so was abandoned.
Since 0.13.0, the plugin is written in Rust, with the much simplified Bash script embedded.
By default the embedded Bash script is extracted at runtime into a temporary directory. This behaviour may be overridden by setting the ``NU_PLUGIN_BASH_ENV_JSON` environment variable, which is then expected to resolve to the path of the pre-installed script.
Logging is supported via the Rust tracing-subscriber
crate, with log-level defined by the environment variable NU_PLUGIN_BASH_ENV_LOG
.
Both the module and the plugin are installable from its flake using Nix Home Manager.
See my own Home Manager flake and nushell module for hints how to achieve this. Note in particular the requirement for each-time plugin registration.
- unsetting an environment variable ought to be possible