Wouldn't you want your name collision test before your call to the private function - just to save the wasted call? (And to have its message redirected to stderr and have a "return 1" or other non-zero value?) Otherwise, I think your idea is a good one, especially if the public function can be as simple as that.
Thanks, Pierre, by the way, for the workarounds. I hadn't considered using indirection that way. On Sat, May 1, 2010 at 6:21 AM, Freddy Vulto <fvu...@gmail.com> wrote: > On 100501 12:40, Pierre Gaston wrote: >> On Sat, May 1, 2010 at 12:26 PM, Dennis Williamson wrote: >> > As Chet said, use internal variables that are unlikely to conflict. >> You can use workarounds like: >> printf -v $a "%s" foobar >> read $a <<< "%s" > > The problem with obfucscated internal variables I think is that my > library code becomes unnecessary obfuscated. That's why I'm thinking an > additional call-layer (workaround 2 in my original mail) is an > improvement in that the private library code "_blackbox()" can use > simple, readable variables without restrictions/conflicts, while the > public layer "blackbox()" checks conflicts, which - unlikely as they > might be - I'd like to return to my library users as a known error > instead of silent failing. > > Revised example, replacing eval with printf -v, thanks: > > # Param: $1 variable name to return value to > # Private library function. Do not call directly. See blackbox() > _blackbox() { > # Just don't declare "local __1" > local a b c d e f g h i j > # ... > # Lots of complicated library code here > # ... > # Return value > printf -v $1 %s b > } > > # Param: $1 variable name to return value to > # Public library function > blackbox() { > local __1 > _blackbox __1 > [[ $1 == __1 ]] && echo "ERROR: variable name conflicts"\ > "with local variable: $1" > printf -v $1 %s "$__1" > } > > blackbox a; echo $a # Outputs "b" all right > blackbox __1 # Outputs error > d='ls /;true'; blackbox "$d" # No more oops > > > Freddy Vulto > http://fvue.nl/wiki/Bash:_passing_variables_by_reference > > >