[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: bin/47597: local and $() don't play well with each other
The following reply was made to PR bin/47597; it has been noted by GNATS.
From: Robert Elz <kre%munnari.OZ.AU@localhost>
Subject: Re: bin/47597: local and $() don't play well with each other
Date: Tue, 26 Feb 2013 14:03:58 +0700
Date: Tue, 26 Feb 2013 02:45:01 +0000 (UTC)
| I don't know what the expected correct behavior here is, so I cannot
| tell if this is a bug or not.
I do not believe there is any expected behaviour, the script is beyond the
bounds of what is intended.
The man page for sh says that the syntax for local is
local [variable | -] ...
Nothing about assigning values as well. That it works even partly is
something of a fluke I'd think.
The special rule about quotes not being required around variable assignments
applies only when they are leading assignments on a (possibly null) command,
not whenever an '=' appears in a command line anywhere.
When you do (what is effectively)
local a=b -c
you'd be amazed if that assigned "b -c" to a, but that's just what your
script does, as word splitting happens after command substitution.
Since local isn't a standardised operator as best I can tell (pity about that)
shells are free to implement it differently, and apparently, do.
The correct way to do what you're trying (as best as "local" can ever be
correct - which is not to bad, as just about all shells support it) is
var=$(echo a=b --c=d) # and now the special quoting rule applies
Also, for what it is worth, the other issue you reported:
| What strikes me as really odd is the fact that sh is raising the
| error when the function f returns, not when var is assigned to.
doesn't occur for me on NetBSD 6/i386 - the error is raised on the assignment
(are you sure you just didn't see some artifact of mixing stderr & stdout
in a peculiar way)?
ps I don't want to try and fathom ksh's convoluted mechanism for local, and
how its syntax should work in this case... bash explicitly allows variable
assignments in a local command.
Main Index |
Thread Index |