[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [BUG] With null IFS, ${1+$*}, ${var-$*}, etc. don't generate fields
From: |
Martijn Dekker |
Subject: |
Re: [BUG] With null IFS, ${1+$*}, ${var-$*}, etc. don't generate fields |
Date: |
Mon, 27 Feb 2017 18:57:10 +0100 |
User-agent: |
Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:45.0) Gecko/20100101 Thunderbird/45.7.1 |
Op 24-02-17 om 21:20 schreef Grisha Levit:
> XRAT C.2.5 : Special Parameters [1] specifically addresses the case of
> ${unset_var-$*}. The following example is provided:
>
> set "abc" "def ghi" "jkl"
> IFS='' # null
> unset var
> printf '%s\n' ${var-$*}
>
> abcdef ghijkl
>
> ..which seems to contradict your proposed expected output.
Hmm. I'm pretty sure that's a bug in their provided examples.
First, bash acts differently for unquoted $* and unquoted ${var-$*} (or
${1+$*}, etc). Given an unset 'var', these should act identically. If
they don't, that's a bug either way.
Second, the cited example is contrary to the specification, which says:
"Expands to the positional parameters, starting from one, initially
producing one field for each positional parameter that is set. When the
expansion occurs in a context where field splitting will be performed,
any empty fields may be discarded and each of the non-empty fields shall
be further split as described in Field Splitting. [...]"
Well, the expansion occurs "in a context where field splitting will be
performed" because it is unquoted (the fact that IFS happens to be null
is neither here nor there; its value or lack thereof has no bearing on
the lexical context). So the non-empty fields, having been generated,
"shall be further split as described in Field Splitting", which, given
that IFS is null, is a no-op.
In other words, quoted "$*" should join the fields into one, but (given
null IFS) unquoted $* should leave the fields alone altogether.
Third, bash is the only shell to act this way, and only for the latter
case. Given the test script:
IFS=
set "abc" "def ghi" "jkl"
printf '$*: '
printf '|%s| ' $*
printf ' ${1+$*}: '
printf '|%s| ' ${1+$*}
test results for some current shells are as follows:
bash: $*: |abc| |def ghi| |jkl| ${1+$*}: |abcdef ghijkl|
dash: $*: |abc| |def ghi| |jkl| ${1+$*}: |abc| |def ghi| |jkl|
yash: $*: |abc| |def ghi| |jkl| ${1+$*}: |abc| |def ghi| |jkl|
zsh: $*: |abc| |def ghi| |jkl| ${1+$*}: |abc| |def ghi| |jkl|
ksh93: $*: |abc| |def ghi| |jkl| ${1+$*}: |abc| |def ghi| |jkl|
mksh: $*: |abc| |def ghi| |jkl| ${1+$*}: |abc| |def ghi| |jkl|
oksh: $*: |abc| |def ghi| |jkl| ${1+$*}: |abc| |def ghi| |jkl|
Hope this helps,
- M.
- [BUG] With null IFS, ${1+$*}, ${var-$*}, etc. don't generate fields, Martijn Dekker, 2017/02/18
- Re: [BUG] With null IFS, ${1+$*}, ${var-$*}, etc. don't generate fields, Chet Ramey, 2017/02/19
- Re: [BUG] With null IFS, ${1+$*}, ${var-$*}, etc. don't generate fields, Grisha Levit, 2017/02/24