Change environment variables to be case-preserving (#12701)

This PR changes `$env` to be **case-preserving** instead of
case-sensitive. That is, it preserves the case of the environment
variable when it is first assigned, but subsequent retrieval and update
ignores the case.

Notably, both `$env.PATH` and `$env.Path` can now be used to read or set
the environment variable, but child processes will always see the
correct case based on the platform.

Fixes #11268.

---

This feature was surprising simple to implement, because most of the
infrastructure to support case-insensitive cell path access already
exists. The `get` command extracts data using a cell path in a
case-insensitive way (!), but accepts a `--sensitive` flag. (I think
this should be flipped around?)
This commit is contained in:
YizhePKU
2024-05-02 06:22:34 +08:00
committed by GitHub
parent 21ebdfe8d7
commit 52d99cc60c
3 changed files with 70 additions and 26 deletions

View File

@ -194,3 +194,15 @@ fn env_var_not_var() {
");
assert!(actual.err.contains("use $env.PWD instead of $PWD"));
}
#[test]
fn env_var_case_insensitive() {
let actual = nu!("
$env.foo = 111
print $env.Foo
$env.FOO = 222
print $env.foo
");
assert!(actual.out.contains("111"));
assert!(actual.out.contains("222"));
}