Skip to content

Commit 083af5b

Browse files
authored
fix(interpreter): remove exported vars from env on unset (#1042)
## Summary - `unset VAR` now also removes the variable from `self.env`, not just `self.variables` - Previously, variable lookup fell back to `self.env`, so exported variables remained accessible after `unset` - Added spec tests for unset of exported and regular variables Closes #946
1 parent 4f06385 commit 083af5b

2 files changed

Lines changed: 28 additions & 0 deletions

File tree

crates/bashkit/src/interpreter/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4794,6 +4794,7 @@ impl Interpreter {
47944794
continue;
47954795
}
47964796
self.variables.remove(&resolved);
4797+
self.env.remove(&resolved);
47974798
self.arrays.remove(&resolved);
47984799
self.assoc_arrays.remove(&resolved);
47994800
for frame in self.call_stack.iter_mut().rev() {
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
### unset_exported_variable
2+
# unset should remove exported vars completely
3+
export UNSET_TEST=value
4+
unset UNSET_TEST
5+
echo "${UNSET_TEST:-gone}"
6+
### expect
7+
gone
8+
### end
9+
10+
### unset_then_check_defined
11+
### skip: [[ -v VAR ]] unary operator not yet implemented
12+
# unset var should not be -v defined
13+
export UNSET_DEF_TEST=x
14+
unset UNSET_DEF_TEST
15+
[[ -v UNSET_DEF_TEST ]] && echo "still set" || echo "unset"
16+
### expect
17+
unset
18+
### end
19+
20+
### unset_regular_variable
21+
# unset non-exported var (verify no regression)
22+
REGULAR=hello
23+
unset REGULAR
24+
echo "${REGULAR:-gone}"
25+
### expect
26+
gone
27+
### end

0 commit comments

Comments
 (0)