[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Bash parameter transforamtion on empty array triggers unset variable

From: Andrew Neff
Subject: Re: Bash parameter transforamtion on empty array triggers unset variable.
Date: Tue, 11 Aug 2020 11:45:41 -0400

Ah, I see the confusion.

The issue you pointed out, "@Q breaks set -o nounset" refers to quote
parameter expansion, as does the line in CHANGES-5.1, 1.q, which makes
sense to call this a bug that was allowed in bash 4.4 and 5.0.

I should have specified, the focus of this issue is the "@a" expansion. It
makes sense that @Q/E/P/A expansion should not work on unset variables with
nounset enabled. However, @a is uniquely different, in that it does not
have to do with the value of the variable, but rather the variable type. My
"set -eu" compatible library uses the @a expansion (for bash 4.4 and newer)
because it had previously worked on unset values with set -u enabled, which
was a very useful feature.

Here are 3 specific details I would like to address:

1. @a expansion should work on unset variables with "set -u" in bash 5.1.
It seems like the correct thing to do. Only @a expansion. This has been a
very useful feature in bash 4.4 and 5.0.
Should fail: (set -eu; declare -a x; echo "${x@Q}")
Should not fail:  (set -eu; declare -a x; echo "${x@a}")

2. With "set -u", the following works in bash 4.4 or newer (and makes sense
that it works): (set -eu; x=(); echo "${x[@]}")
Here x is not unset, it is set to an empty array. This expansion make sense
with nounset turned on because x is not unset, it is set to ()
However, this fails: (set -eu; x=(); echo "${x@a}")
This is an inconsistent behavior, and it seems to me the ${x@a} should
definitely work here, with nounset turns on

3. The same as #2, but for associative arrays
Works: (set -eu; declare -A x=(); echo "${x[@]}")
Does not work, but should: (set -eu; declare -A x=(); echo "${x@a}")


On Tue, Aug 11, 2020 at 9:51 AM Chet Ramey <chet.ramey@case.edu> wrote:

> On 8/10/20 5:52 PM, Andrew Neff wrote:
> > Bash Version: 5.1
> > Patch Level: 0
> > Release Status: alpha
> >
> > Description:
> >         I do not know if this is related to bash 5.1 erroneously being
> > "a little aggressive about skipping over empty strings" mentioned
> > in "Declaring arrays with empty string in one line is bugged", but using
> > parameter transformation on an empty array, throws an error if "set -u"
> is
> > turned on. This was not how bash 4.4 and 5.0 worked. This bug makes it
> > impossible to check if an empty variable is an array using parameter
> > transformation while "set -u" is turned on
> This was a bug in bash-5.0 (and 4.4) and was fixed in early March 2019 as
> the result of
> https://lists.gnu.org/archive/html/bug-bash/2019-03/msg00010.html
> It's in CHANGES.
> There are some other changes in how bash displays attributes of unset
> variables when `nounset' is not enabled, but unset variables used in word
> expansions should trigger an error -- with the usual @/* exceptions -- when
> set -u is enabled.
> --
> ``The lyf so short, the craft so long to lerne.'' - Chaucer
>                  ``Ars longa, vita brevis'' - Hippocrates
> Chet Ramey, UTech, CWRU    chet@case.edu    http://tiswww.cwru.edu/~chet/

reply via email to

[Prev in Thread] Current Thread [Next in Thread]