nushell/crates/nu-engine
Hristo Filaretov 88817a8f10
Allow environment variables to be hidden (#3950)
* Allow environment variables to be hidden

This change allows environment variables in Nushell to have a value of
`Nothing`, which can be set by the user by passing `$nothing` to
`let-env` and friends.

Environment variables with a value of Nothing behave as if they are not
set at all. This allows a user to shadow the value of an environment
variable in a parent scope, effectively removing it from their current
scope. This was not possible before, because a scope can not affect its
parent scopes.

This is a workaround for issues like #3920.

Additionally, this allows a user to simultaneously set, change and
remove multiple environment variables via `load-env`. Any environment
variables set to $nothing will be hidden and thus act as if they are
removed. This simplifies working with virtual environments, which rely
on setting multiple environment variables, including PATH, to specific
values, and remove/change them on deactivation.

One surprising behavior is that an environment variable set to $nothing
will act as if it is not set when querying it (via $nu.env.X), but it is
still possible to remove it entirely via `unlet-env`. If the same
environment variable is present in the parent scope, the value in the
parent scope will be visible to the user. This might be surprising
behavior to users who are not familiar with the implementation details.

An additional corner case is the the shorthand form of `with-env` does
not work with this feature. Using `X=$nothing` will set $nu.env.X to the
string "$nothing". The long-form works as expected: `with-env [X
$nothing] {...}`.

* Remove unused import

* Allow all primitives to be convert to strings
2021-08-26 08:15:58 -05:00
..
src Allow environment variables to be hidden (#3950) 2021-08-26 08:15:58 -05:00
tests Fix issue in external subexpression paths (#3642) 2021-06-18 07:59:58 +12:00
Cargo.toml Bump to 0.36 (#3963) 2021-08-25 06:01:17 +12:00
README.md Fix typos and capitalization of "Unicode" (#3234) 2021-04-04 07:14:07 +12:00

Nu-Engine

Nu-engine handles most of the core logic of nushell. For example, engine handles: - Passing of data between commands - Evaluating a commands return values - Loading of user configurations

Top level introduction

The following topics shall give the reader a top level understanding how various topics are handled in nushell.

How are environment variables handled?

Environment variables (or short envs) are stored in the Scope of the EvaluationContext. That means that environment variables are scoped by default and we don't use std::env to store envs (but make exceptions where convenient).

Nushell handles environment variables and their lifetime the following:

  • At startup all existing environment variables are read and put into Scope. (Nushell reads existing environment variables platform independent by asking the Host. They will most likely come from std::env::*)
  • Envs can also be loaded from config files. Each loaded config produces a new ScopeFrame with the envs of the loaded config.
  • Nu-Script files and internal commands read and write env variables from / to the Scope. External scripts and binaries can't interact with the Scope. Therefore all env variables are read from the Scope and put into the external binaries environment-variables-memory area.