Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: special characters in file names issue



On Fri, Nov 10, 2023 at 5:34 PM Lawrence Velázquez <larryv@xxxxxxx> wrote:
>
> On Fri, Nov 10, 2023, at 4:50 AM, Roman Perepelitsa wrote:
> > Associative arrays in zsh are finicky when it comes to the content of
> > their keys. The problem you are experiencing can be distilled to this:
> >
> >     % typeset -A dict
> >     % key='('
> >     % [[ -v dict[$key] ]]
> >     zsh: invalid subscript
> >
> > There is no simple quoting that you can apply to $key here: (q), (b),
> > etc. are all wrong. You could perhaps escape a specific list of
> > characters ('(', '[', '{' but not '$' or '*') although my memory tells
> > me that some keys cannot be made to work under `[[ -v ...]]` or
> > `unset` no matter how you try to escape them. I could be wrong though.
>
> Subscripted arguments to [[ -v ... ]] appear to undergo a second
> round of expansions [...]

Oh wow! This is very surprising to me.

    % foo=x
    % bar='$foo'
    % typeset -A dict=(x 1)
    % [[ -v dict[$bar] ]] && echo 'very surprising'
    very surprising

There is also a scarier version of this, which causes execution of an
external command when I don't expect it.

    % typeset -A dict
    % var='dict[$(print -u2 pwnd)]'
    % [[ -v $var ]]
    pwnd

Is this intended?

On Fri, Nov 10, 2023 at 6:03 PM Bart Schaefer <schaefer@xxxxxxxxxxxxxxxx> wrote:
>
> Do I misunderstand something about the example?

No, it's my bad misremembering stuff. There was something with
"unset[$key]" where I was unable to make it work for any "$key" but I
cannot recall the specifics. It could have had something to do with
binary data in keys.

> -v has to evaluate the subscript to find the array element [...]

Why does it have to evaluate the subscript? `unset` does not do it,
why would [[ -v .. ]] be different?

Roman.




Messages sorted by: Reverse Date, Date, Thread, Author