On Wed, Oct 25, 2017 at 10:03:09AM +0200, Michael Haggerty wrote:
> > Yeah. It's supported by dash and many other shells, but we do try to
> > avoid it[1]. I think in this case we could just drop it (but keep
> > setting the "local foo" ones to empty with "foo=".
>
> I do wish that we could allow "local", as it avoids a lot of headaches
> and potential breakage. According to [1],
Agreed.
> > However, every single POSIX-compliant shell I've tested implements the
> > 'local' keyword, which lets you declare variables that won't be
> > returned from the current function. So nowadays you can safely count
> > on it working.
>
> He mentions that ksh93 doesn't support "local", but that it differs from
> POSIX in many other ways, too.
Yes, the conclusion we came to in the thread I linked earlier is the
same: ksh is affected, but that shell is a problem for other reasons. I
don't know if anybody tested with "modern" ksh like mksh, though. Should
be easy enough:
cat >foo.sh <<\EOF
fun() {
local x=3
echo inside: $x
}
x=2
fun
echo after: $x
EOF
mksh foo.sh
which produces the expected:
inside: 3
after: 2
So that's good.
> Perhaps we could slip in a couple of "local" as a compatibility test to
> see if anybody complains, like we did with a couple of C features recently.
That sounds reasonable to me. But from the earlier conversation, beware
that:
local x
...
x=5
is not necessarily enough to notice the problem on broken shells (they
may complain that "local" is not a command, and quietly stomp on the
global). I think:
local x=5
would be enough (though depend on how you use $x, the failure mode might
be pretty subtle). Or we could even add an explicit test in t0000 like
the example above.
> But I agree that this bug fix is not the correct occasion to change
> policy on something like this, so I'll reroll without "local".
Also agreed.
-Peff