Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > gnu.bash.bug > #16830
| From | Oğuz <oguzismailuysal@gmail.com> |
|---|---|
| Newsgroups | gnu.bash.bug |
| Subject | Re: Incorrect / Inconsistent behavior with nameref assignments in functions |
| Date | 2020-08-28 18:37 +0300 |
| Message-ID | <mailman.1616.1598629026.2469.bug-bash@gnu.org> (permalink) |
| References | <a20e4692-69b3-9836-4861-3e822e407ef7@binarus.de> <20200828152846.GI931@eeg.ccf.org> <CAH7i3Lpq3dWx55mGcuu4TK0gQaLCFBQwcoaeWR_-tunwxK6ijQ@mail.gmail.com> |
28 Ağustos 2020 Cuma tarihinde Greg Wooledge <wooledg@eeg.ccf.org> yazdı:
> On Fri, Aug 28, 2020 at 10:56:34AM +0200, Binarus wrote:
> > #!/bin/bash
> >
> > function Dummy() {
> >
> > local -n namerefArray="$1"
> > local -a -i myArray=("${namerefArray[@]}")
> >
> > local -p
> > }
> >
> > declare -a -i myArray=('1' '2' '3')
>
> You've got a local variable with the same name as the global variable
> that you're attempting to pass by reference. This will not work.
>
>
These scripts yield identical output on bash-5.1 though.
> Namerefs (declare -n) in bash are *not* like uplevel commands in Tcl.
> They cause the referenced variable name to be evaluated just like any
> other variable would be, starting at the current function scope, then
> going up to the caller, and so on.
>
> If you want to use namerefs in a function in bash, you MUST go out of
> your way to minimize the chances of a collision between the caller's
> variable refererance and ANY local variable of the function. Not just
> the nameref itself, but any other incidental variables used in the
> function. (As you aptly demonstrated here.)
>
> So, you can't write functions like this:
>
> func1() {
> declare -n ref="$1"
> local i
> ...
> }
>
> Instead, you need crazy things like this:
>
> func1() {
> declare -n _func1_ref="$1"
> local _func1_i
> ...
> }
>
>
This doesn't make the slightest sense. What is the point of having local
variables then?
> And then you just have to pray that the caller respects you enough not
> to use variables named with _func1_ prefixes.
>
> There is no 100% bulletproof solution to this issue.
>
> See also <https://mywiki.wooledge.org/BashProgramming#Functions>.
>
>
--
Oğuz
Back to gnu.bash.bug | Previous | Next | Find similar
Re: Incorrect / Inconsistent behavior with nameref assignments in functions Oğuz <oguzismailuysal@gmail.com> - 2020-08-28 18:37 +0300
csiph-web