declare -nt r=a f() { declare a declare -n r=a declare -p a r } f unset -f f f() { declare a declare -n r r=a declare -p a r } f echo $? unset -f f P=12345 function foo { typeset -n r typeset -n r=P typeset -p r } foo unset P foo ref=outside f() { unset var declare -n ref=var declare -n ref; declare -p ref; } f unset ref foo typeset -n r=a f() { typeset a typeset -n r typeset -n r r=a typeset -p a r } f echo $? unset -n r unset -f f function foo { typeset -n r typeset -n r typeset -p r } foo unset -f foo function foo { typeset r typeset -n r typeset -p r } foo unset -f foo foo() { typeset -n foo typeset foo=12345 typeset -p foo } foo unset -f foo foo() { typeset -n foo typeset -n foo=12345 typeset -p foo } foo unset -f foo