On 12/8/14 9:51 PM, konsolebox wrote:
> On Sun, Dec 7, 2014 at 7:24 AM, Stephane Chazelas
> <stephane.chaze...@gmail.com> wrote:
>> $ b='($(uname>&2))' bash -c 'a=(); declare -r a=$b'
>> Linux
> 
> I actually also don't like that form of implementation.  Even if declare
> is a builtin and not a reserved word, it still has some special
> treatments that's different from a simple command.  For example in a
> simple command like echo, something like 'echo a=(1 2 3 4)' would cause
> syntax error.  Word splitting and pathname expansion also doesn't happen
> unless when assigning elements in an array.  If declare is able to
> recognize assignments separated by spaces, I think it would have not
> been difficult avoiding $b to be evaluated since it's really not meant
> to be.  It clearly is a simple form of assignment.  Imo even if declare
> is a builtin (which is actually a little special over a normal one), it
> should have just emulated behavior of normal assignments and did nothing
> more than it besides declaring the type (and optionally have some other
> features not related to assignment).

It does implement `emulated behavior of normal assignments'.  The question
is whether or not it should do that after having had its arguments undergo
one round of word expansion.

> (But I think those who used to recommend using declare as a general tool
> for assigning values remotely over evil eval would love it since
> it makes assignments like `declare -g "$var=$something"` possible
> which naturally should have been illegal.)

Why should this have been illegal?  Even Posix acknowledges that constructs
like `export $one=$two' are valid.  The question is what to do about
compound assignment.

> Anyhow, this problem would only happen if a variable in a specific
> scope (and only in that scope) has already been set previously as an
> array and it doesn't always happen if you write your scripts well.
> 
>> It may be worth recommending people do a "unset var" before
>> doing a "declare [-<option>] var"
> 
> I actually find it better to mention that on a simple assignment like
> declare var=$something, var's type doesn't change if it has already been
> declared previously as an array.

As I mentioned in a previous message, there's no reason for a script writer
to expect that `declare x=y' unsets x.  Assignment without using `declare'
doesn't.  Maybe it is worth saying that nothing will change an array
variable's type, though it's possible to promote a variable to an array.

-- 
``The lyf so short, the craft so long to lerne.'' - Chaucer
                 ``Ars longa, vita brevis'' - Hippocrates
Chet Ramey, ITS, CWRU    c...@case.edu    http://cnswww.cns.cwru.edu/~chet/

Reply via email to