On Fri, Mar 23, 2018 at 12:19:28PM +0100, Harald van Dijk wrote:
>
> >Right.  I think I'll leave this one alone.  It worked purely by
> >chance previously because dash incorrectly used the first IFS
> >character even when it's outside of double-quotes, which is why
> >the expansion ${@%2 C3} matches.
> 
> When the first IFS character is a whitespace character, which it usually is,
> it's not incorrect: inserting that character and then splitting on it
> produces the exact results that POSIX requires. It's only when IFS doesn't
> start with a whitespace character that it's incorrect.

Where does POSIX require this? AFAICS the only time IFS comes into
play in forming the fields is with "$*" which is not relevant here.

        @
        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. When the expansion occurs within
        double-quotes, the behavior is unspecified unless one of the
        following is true: Field splitting as described in Field Splitting
        would be performed if the expansion were not within double-quotes
        (regardless of whether field splitting would have any effect;
        for example, if IFS is null).

        The double-quotes are within the word of a ${parameter:-word}
        or a ${parameter:+word} expansion (with or without the <colon>;
        see Parameter Expansion) which would have been subject to field
        splitting if parameter had been expanded instead of word.

        If one of these conditions is true, the initial fields shall be
        retained as separate fields, except that if the parameter being
        expanded was embedded within a word, the first field shall be
        joined with the beginning part of the original word and the
        last field shall be joined with the end part of the original
        word. In all other contexts the results of the expansion
        are unspecified. If there are no positional parameters, the
        expansion of '@' shall generate zero fields, even when '@'
        is within double-quotes; however, if the expansion is embedded
        within a word which contains one or more other parts that expand
        to a quoted null string, these null string(s) shall still produce
        an empty field, except that if the other parts are all within
        the same double-quotes as the '@', it is unspecified whether
        the result is zero fields or one empty field.

        *
        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. When the expansion occurs in a context where
        field splitting will not be performed, the initial fields shall be
        joined to form a single field with the value of each parameter
        separated by the first character of the IFS variable if IFS
        contains at least one character, or separated by a <space> if IFS
        is unset, or with no separation if IFS is set to a null string.

> In bash and ksh nothing funky is going on. This is well-defined and
> documented in the manuals: the trimming is done for each field. So when $#
> is 3, ${@%pat} is equivalent to ${1%pat} ${2%pat} ${3%pat}, except that pat
> is only expanded once.
> 
> If you're interested in implementing that in dash, a relevant test case is
> 
>   set -- A1 B2 C3
>   unset p
>   echo ${1%${p+x}${p=?}} ${2%${p+x}${p=?}} ${3%${p+x}${p=?}}
>   unset p
>   echo ${@%${p+x}${p=?}}
> 
> In bash and ksh, this is supposed to print, and does print:
> 
>   A B2 C3
>   A B C

Fair enough.  I'm not interested in implementing that right now.

Cheers,
-- 
Email: Herbert Xu <[email protected]>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt
--
To unsubscribe from this list: send the line "unsubscribe dash" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to