# This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # set -o posix fn() { foo=abc : ; typeset +x foo; printenv|grep ^foo=; } fn unset -v foo unset -f fn func1() { var=1 var=2 : # or 'var=2 return', or another special builtin unset -v var echo $FUNCNAME: var = $var } func2() { func1 unset -v var # bug: fails silently } func1 echo ${var+"BUG: still set 1"} unset var func2 echo ${var+"BUG: still set 2"} unset -v var unset -f func1 func2 fn() { foo=abc : ; typeset +x foo; echo -n 'inside: ' ; declare -p foo; } fn echo outside: declare -p foo unset -v foo unset -f fn func() { var=value declare -x var echo -n 'inside: ' ; declare -p var } var=one func echo -n 'outside: ' ; declare -p var unset -v var unset -f func # this will probably change behavior; export shouldn't behave like this when # not in posix mode and the sequencing is probably wrong in posix mode. since # export is a special builtin, the variable assignment should modify the # local variable, as if a standalone assignment statement had been executed # (posix modifying "the current execution environment") leaving the global # variable unchanged. all shells, including bash, modify the local variable; # bash was the only one that propagates the value out to the calling # environment, but no longer does so. func() { local var=inside var=value export var echo -n 'inside: ' ; declare -p var } var=outside func echo -n 'outside: ' ; declare -p var unset -v var unset -f func func() { local var=local var=inside : echo -n 'inside: ' ; declare -p var } var=outside func echo -n 'outside: ' ; declare -p var unset -v var unset -f func func() { echo -n 'inside func: ' ; echo "var=${var-}" } unset -v var var=one : echo -n 'outside 1.0: ' ; echo "var=${var-}" unset -v var var=one eval ':' echo -n 'outside 1.1: ' ; echo "var=${var-}" unset -v var var=two func echo -n 'outside 2.0: ' ; echo "var=${var-}" var=global var=two func echo -n 'outside 2.1: ' ; echo "var=${var-}" unset -v var unset -f func func1() { var=value export var echo -n 'inside func1: ' ; echo "var=${var-}" } var=outside func1 echo -n 'outside 3.0: ' ; echo "var=${var-}" unset -v var unset -f func1 func2() { local var=local var=global : echo -n 'inside func2: ' ; echo "var=${var-}" } var=outside func2 echo -n 'outside 4.0: ' ; echo "var=${var-}" unset -v var unset -f fecho foo bar fecho() { echo $var } foo() { local var="foo: bye bye" var="foo: hello world" fecho } bar() { var="bar: hello world" fecho } var=global var=outside foo echo after foo: var=$var var=global var=outside bar echo after bar: var=$var unset -v var