Computed variables are global

Variables like $status and $history showed up in all scopes, including
universal, when querying with `set -q` or `set -S`.

This makes it so they all only count as set in global scope, because
we already only allow assignment to electric variables in global scope.

Fixes #7032
This commit is contained in:
Fabian Homborg 2020-05-27 19:56:47 +02:00
parent 46068cd257
commit 7cb452c7e7
2 changed files with 17 additions and 1 deletions

View file

@ -734,7 +734,12 @@ maybe_t<env_var_t> env_scoped_impl_t::try_get_universal(const wcstring &key) con
maybe_t<env_var_t> env_scoped_impl_t::get(const wcstring &key, env_mode_flags_t mode) const {
const query_t query(mode);
maybe_t<env_var_t> result = try_get_computed(key);
maybe_t<env_var_t> result;
// Computed variables are effectively global and can't be shadowed.
if (query.global) {
result = try_get_computed(key);
}
if (!result && query.local) {
result = try_get_local(key);
}

View file

@ -624,4 +624,15 @@ $FISH -c 'set __fish_test_universal_exported_var 2'
env | string match -e __fish_test_universal_exported_var
#CHECK: __fish_test_universal_exported_var=2
# Test that computed variables are global.
# If they can be set they can only be set in global scope,
# so they should only be shown in global scope.
set -S status
#CHECK: $status: set in global scope, unexported, with 1 elements
#CHECK: $status[1]: |0|
set -ql history
echo $status
#CHECK: 1
true