On 22/03/2018 22:38, Martijn Dekker wrote:
Op 22-03-18 om 20:28 schreef Harald van Dijk:
On 22/03/2018 03:40, Martijn Dekker wrote:
This patch fixes the bug that, given no positional parameters, unquoted
$@ and $* incorrectly generate one empty field (they should generate no
fields). Apparently that was a side effect of the above.

This seems weird though. If you want to remove the recording of empty
regions because they are pointless, then how does removing them fix a
bug? Doesn't this show that empty regions do have an effect? Perhaps
they're not supposed to have any effect, perhaps it's a specific
combination of empty regions and something else that triggers some bug,
and perhaps that combination can no longer occur with your patch.

The latter is my guess, but I haven't had time to investigate it.

Looking into it again:

When IFS is set to an empty string, sepc is set to '\0' in varvalue(). This then causes *quotedp to be set to true, meaning evalvar()'s quoted variable is turned on. quoted is then passed to recordregion() as the nulonly parameter.

ifsp->nulonly has a bigger effect than merely selecting whether to use $IFS or whether to only split on null bytes: in ifsbreakup(), nulonly also causes string termination to be suppressed. That's correct: that special treatment is required to preserve empty fields in "$@" expansion. But it should *only* be used when $@ is quoted: ifsbreakup() takes nulonly from the last IFS region, even if it's empty, so having an additional zero-length region with nulonly enabled causes confusion.

Passing quoted by value to varvalue() and not attempting to modify it should therefore, and in my quick testing does, also work to fix the original $@ bug.

Harald van Dijk
To unsubscribe from this list: send the line "unsubscribe dash" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to