[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: "$@" expansion when it is consists of only null strings
From: |
Robert Elz |
Subject: |
Re: "$@" expansion when it is consists of only null strings |
Date: |
Mon, 25 Feb 2019 11:22:16 +0700 |
Date: Sun, 24 Feb 2019 18:37:33 -0500
From: Grisha Levit <grishalevit@gmail.com>
Message-ID:
<CAMu=BrqKMX7pFGARH2DNaX3TBfArhuTUVvQ+O3E+MMx165sHSw@mail.gmail.com>
| There are some what seem to be regressions (?) in bash-4.4 and
| bash-5.0 regarding the handling of "$@" expansion when it consists
| entirely of null strings.
I think these are actually more the insertion of explicit null
strings, rather than $@ when it contains null strings. These
are essentially the same as the ${b+s ''} issue that was discussed
a week or so ago, and which Chet already said he would look into.
| $ set -- ''
| $ n "$@"''
| 0
Should be 1. It would be if the '' null string was not there.
| $ set -- '' ''
| n ''"$@"
| 1
Should be 2. $1 gets obliterated by the '' and $2 remains.
| n "$@"''
| 1
Same (should be 2) except here $1 remains and $2 is lost.
| n ''"$@"''
| 0
Again, should be 2, here both $1 and $2 are lost.
Of course if you just did
n "$@"
you'd get 2 as you should (no explicit null strings to kill the $@ expansions).
| $ set -- ''
| $ n ${_+''"$@"''}
| 0
Should be 1
| $ n ${_+"$@" "$@"}
| 1
Should be 2. Not sure what is up with that one as there
are no explicit null strings to confuse things. Each $@ should
expand to (quoted) $1 (even though that means ""), which is then
field split at the (unquoted) space to leave 2 null string args.
| On a related note, with $#=0, bash-20190220 fixed the expansion of
| ${_"$@"''} and ${''"$@"} to produce a single field but not so with:
I assume you mean ${_+"$@"''} and ${_+''"$@"} ? But even bash2 got
those correct (they're both 1). bash5 gets the 2nd one wrong (0)
but I might be testing an older version than you meant had fixed it
(I do not build development versions.) BASH_VERSION='5.0.0(1)-release'
| $ set --
| $ n ${_+''"$@"''}
| 0
Should also be 1.
| And these have always been the case, but I'm not sure if it should be so?
|
| $ set --
| $ n "${_+"$@"}"
| 1
| $ n "${_+$@}"
| 1
Those are, I believe, unspecified cases. The first is definitely
because of the strange quoting (the " chare are in order, open, close,
open, close, not open open close close). Anything could replace the
$@ in that (even just x ) and you'd still get unspecified results.
The second because there's no real agreement whether it should produce
0 or 1 (different shells do different things for that one, and there's
no particularly good argument for one or the other, so posix, I believe,
makes that one unspecified as well.)
kre
ps: for a couple of the last of those (before the unspecified ones)
bosh and yash seem to get them wrong as well, both giving 0 for both of
n ${_+''"$@"''} and n ${_+"$@" "$@"} ... but that's because they don't
implement $_ (and good on them for that, stupid thing it is), so the
word after the "+" isn't used unless one does _=X or similar first.
bosh still gets n ${_+"$@" "$@"} wrong though (0), even when _ is set.