I think I found a much cleaner workaround. It looks like a called function can really unset local variables in the caller(?!), so that passing by reference works:
_blackbox_unset_vars "$2" "$3" If you would try to unset local variables directly in "blackbox()", using: unset -v "$2" "$3" , passing by reference fails. Here's the code: ---8<------------------------------------------------------------------- unset -v i a b d # Make sure vars are unset # Unset variables # Param: $* variables to unset _blackbox_unset_vars() { unset -v "$@" } # Param: $1 input argument # Param: $2 variable name to return value to # Param: $3 variable name to return array value to # Public library function blackbox() { local a b c d e f g h i j k=( foo "bar cee" ) # ... # Lots of library code here # ... # Doing a 'unset -v "$2" "$3"' directly doesn't work? _blackbox_unset_vars "$2" "$3" printf -v"$2" %s b # Return value "b" printf -v"$3" x && eval $3=\(\"\$...@]}\"\) # Return array $k } client() { local i a b d blackbox i a b; printf $'%s\n' $a "$...@]}" # Outputs vars ok d='ls /;true'; blackbox i "$d" "$d" # No oops } client echo "globals: $i $a $b $d" # No globals created ---8<------------------------------------------------------------------- It seems to work on bash-3.2.39, 4.0.33 and 4.1.2. Is this behaviour safe to exploit? Freddy Vulto http://fvue.nl/wiki/Bash:_passing_variables_by_reference