I think most people will agree that unset is extremely surprising, though they may point to different parts of it as the source of their surprise.
8 years after Freddy Vulto's initial investigations, there are many things I still don't understand. For example, consider this code straight from his web site[1]: ===================================================================== wooledg:~$ cat freddy #!/bin/bash a=0 b=0 c=0 d=0 e=0 _unset() { unset -v b c c d d d e; } t1() { local a=1 b=1 c=1 d=1 t2 } t2() { local a=2 b=2 c=2 d=2 e=2 _unset echo a:$a b:$b c:$c d:$d e:$e } t1 wooledg:~$ ./freddy a:2 b:1 c:0 d: e:0 ===================================================================== But if I make a tiny change to it (eliminating the _unset function which *appears* to have no purpose), it has entirely different behavior: ===================================================================== wooledg:~$ cat freddy2 #!/bin/bash a=0 b=0 c=0 d=0 e=0 t1() { local a=1 b=1 c=1 d=1 t2 } t2() { local a=2 b=2 c=2 d=2 e=2 unset -v b c c d d d e echo a:$a b:$b c:$c d:$d e:$e } t1 wooledg:~$ ./freddy2 a:2 b: c: d: e: ===================================================================== I don't understand the difference. Does unset create some kind of "placeholder" in the current function (but not in a caller)? [1] http://fvue.nl/wiki/Bash:_Unset