I added a bit if code to show some things that I did and did not expect. #!/bin/bash
var=global foo() { echo local var=foo unset var echo ${FUNCNAME[@]}: $var displayVar displayVarfoo() { echo ${FUNCNAME[@]}: $var } displayVarfoo } bar_unset() { unset var echo ${FUNCNAME[@]}: $var displayVar displayVarbar_unset() { echo ${FUNCNAME[@]}: $var } displayVarbar_unset echo newVar=bar_unset } bar() { echo local var=bar bar_unset echo ${FUNCNAME[@]}: $var $newVar displayVar displayVarbar() { echo ${FUNCNAME[@]}: $var $newVar } displayVarbar } displayVar() { echo ${FUNCNAME[@]}: $var $newVar } foo bar echo $var $newVar Produces: root@billlaptop ycc# ./zzz foo main: displayVar foo main: displayVarfoo foo main: bar_unset bar main: global displayVar bar_unset bar main: global displayVarbar_unset bar_unset bar main: global bar main: global bar_unset displayVar bar main: global bar_unset displayVarbar bar main: global bar_unset global bar_unset With both internal and external display functions, I don't see a change in their view of the world. That was expected as there's no such thing as a nested or sub function from what I've been able to determine. All functions live just below main and no matter how defined nested or not, they all end up at the same level. Correct? It appears that in foo, once the name is unset, any sub function in the call chain can no longer see that name. So, if you want to make sure a sub function can't touch a variable, put another function in between that localises and then unsets the variable. When newVar is created in bar_unset, it is created at the main level. bar_unset is long gone and the variable it created lives on in Main. The tail wagging the dog comes to mind. If there's another interpretation than the one I came up with, please correct me as much of this is guess work on my part. -- Bill Gradwohl