[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [coreutils] Re: Builds of coreutils-8.6.19-1369f
From: |
Jim Meyering |
Subject: |
Re: [coreutils] Re: Builds of coreutils-8.6.19-1369f |
Date: |
Sat, 06 Nov 2010 17:02:28 +0100 |
Eric Blake wrote:
> On 11/06/2010 08:19 AM, Jim Meyering wrote:
>> Andreas Schwab wrote:
>>
>>> Jim Meyering <address@hidden> writes:
>>>
>>>> Here's a better test case:
>>>>
>>>> $ /bin/sh -c 'f(){ local s=$IFS; test -n "$s"; }; f'
>>>> [Exit 1]
>>>>
>>>> And based on that, here's a patch to gnulib's tests/init.sh
>>>> that solves the problem more generally:
>>>> (but this is not enough for coreutils, since some
>>>> failing tests don't yet use init.sh)
>>>
>>> Why not just add the quotes? This isn't formally an assignment, so the
>>> behaviour of the shell is reasonable after all.
>>
>> Actually, I'm doing both for the upcoming release.
>> Adding the quotes as a stop-gap measure, because it feels like a
>> kludge. I'll remove it once I've converted all tests to use init.sh.
>> IMHO, the fact that VAR=$OTHER_VAL never needs quotes
>> should imply that `local VAR=$OTHER_VAL' also requires no quotes.
>
> Local is not required by POSIX.
Yes, that is unfortunate.
However, without it, we end up perpetrating unspeakable
crimes upon variable names -- or violating user name-spaces,
or simply writing uglier code than we could have with "local".
As to whether all users of init.sh can deal with this additional
constraint, I have my doubts, and hence I have not pushed the
change to the gnulib repository. It may make sense to allow
that shell-selection snippet to be customized via some new
separate file, say init.early, that would be sourced early on.
> If local is a normal application, then
> it requires quotes. Only shells that provide it as a special builtin,
> like bash, can support 'local s=$IFS' without needing the quotes.
>
> By the way, if you insist on having 'local', even though it is not
> POSIX, you could at least work around the BSD shell issue by:
>
> local s
> s=$IFS
Thanks, but while that would be good enough for now,
there's no telling whether a similar use appearing
a few months from now would be caught in review.
Requiring a sensible shell -- thus relieving us of the burden of
remembering yet another portability quirk -- is one of my favorite
flavors of defensive programming.
> rather than joining the assignment in the same expression as the
> declaration. This is a good habit to get into anyways, since:
>
> local s=$(false); echo $?
> 0
> local t; t=$(false); echo $?
> 1
>
> that is, local is an expression of its own, and succeeds if the
> assignment completed, throwing out the status of any command
> substitutions used to compute that value; while doing assignment on its
> own line has nothing to override the command substitution value.
Thanks! I didn't know about that one, and in fact had a few
(mis)uses matching just that pattern in my shell startup files:
local rev=$(< $pv) || return 1
Rewrote it as you'd expect, now:
local rev
rev=$(< $pv) || return 1
- Re: [coreutils] Re: Builds of coreutils-8.6.19-1369f, (continued)
- Re: [coreutils] Re: Builds of coreutils-8.6.19-1369f, Jim Meyering, 2010/11/06
- Re: [coreutils] Re: Builds of coreutils-8.6.19-1369f, Ralf Wildenhues, 2010/11/07
- Re: [coreutils] Re: Builds of coreutils-8.6.19-1369f, Jim Meyering, 2010/11/07
- Re: [coreutils] Re: Builds of coreutils-8.6.19-1369f, Ralf Wildenhues, 2010/11/07
- Re: [coreutils] Re: Builds of coreutils-8.6.19-1369f, Jim Meyering, 2010/11/13
- Re: [coreutils] Re: Builds of coreutils-8.6.19-1369f, Andreas Schwab, 2010/11/06
- Re: [coreutils] Re: Builds of coreutils-8.6.19-1369f, Jim Meyering, 2010/11/06
- Re: [coreutils] Re: Builds of coreutils-8.6.19-1369f, Andreas Schwab, 2010/11/06
- Re: [coreutils] Re: Builds of coreutils-8.6.19-1369f, Jim Meyering, 2010/11/06
- Re: [coreutils] Re: Builds of coreutils-8.6.19-1369f, Eric Blake, 2010/11/06
- Re: [coreutils] Re: Builds of coreutils-8.6.19-1369f,
Jim Meyering <=