bug-bash
[Top][All Lists]
Advanced

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

Re: empty nameref issue


From: Chet Ramey
Subject: Re: empty nameref issue
Date: Wed, 1 Dec 2021 09:33:08 -0500
User-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:91.0) Gecko/20100101 Thunderbird/91.3.2

On 11/28/21 9:13 AM, Léa Gris wrote:
> 
> This is ok as here:
> 
>> # declare nameref without assigned value
>> declare -n ref
>>
>> # use nameref as iterator
>> for ref in foo bar baz
>> do ref='Hello the World!'
>> done
>>
>> declare -p foo bar baz
> 
> although: declare -n ref
> leaves the ref variable in a limbo state with no value

It's not a `limbo state'; it's an unset variable like any other. There's
no real difference between that and `export foo': you have an object with
an attribute, but it's unset.

>> $ unset -n ref; declare -n ref; printf %q\\n "$ref"
>> ''
> 
> This strangely cause no error and returns an empty string.

Just like referencing any unset variable.

>> $ unset -n ref; declare -n ref; printf %q\\n "${!ref}"
>> bash: ref: invalid indirect expansion

> 
> But trying to expand the value of the nameref itself causes this "invalid
> indirect expansion error"

In this case, you actually try to get the value. There's no value -- the
variable is unset -- so you get an error because there's nothing to
expand.

> 
> This seems counter-intuitive.
> Intuitively:
> - Expanding the value of a nameref without an assigned value should return
> an empty string.
> - Expanding the value of the refered variable whose nameref is undefined
> would return some error
> 
> The other related issue is that this limbo empty state of a nameref is only
> obtained with an initial `declare -n ref`.

You have created an unset variable with an attribute. If you assign a value
to it, it will behave as namerefs are intended.

> There is no way to later clear or assign an empty string to a nameref
> unless destroying and recreating the nameref with:
> 
>> unset -n ref
>> declare -n ref

This doesn't make sense. The way to `clear' a variable is to unset it.
Why would you try to assign the empty string to a nameref variable? Why
use a nameref in that case?


-- 
``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]