[Bash-completion-devel] Passing variables by reference

Freddy Vulto fvulto at gmail.com
Sun May 9 20:57:54 UTC 2010

The way we now do "passing variables by reference" (working around the conflict
with local variables) felt a bit awkward so I put my workaround to the test on
the bug-bash mailing list.

After having discovered some surprising (at least for me) behaviour of `unset'
the final outcome seems to be an elegant solution, similar to Tcl's `upvar':

    upvar() { unset -v "$1" && eval $1=\"\$2\"; }
    blackbox() { local "$1" && upvar $1 bar; }
    f() { local b; blackbox b; echo $b; }
    f  # Ok: b=bar

If anyone wants to read and/or contribute, the thread is:

I'm summarizing the solution here:

and explaining the behaviour of `unset' here:

I'll do some further testing and if things look all right I'll apply the
`upvar' solution to bash-completion, getting rid of the additional call-layer
- _get_comp_words_by_ref > __get_comp_words_by_ref
- __get_cword_at_cursor_by_ref > ___get_cword_at_cursor_by_ref

BTW, I'm trying to reuse the bash-completion test suite for testing standalone
bash solutions like this, but reusing the bash-completion test suite is not
straightforward at the moment.  Perhaps somewhere in the roadmap we can try
thinking about separating the test suite into a standalone project?  I think
this would benefit other bash projects (they'll have a test suite) and
bash-completion (the test suite would become better).


Freddy Vulto

More information about the Bash-completion-devel mailing list