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

Re: is variable with variable name possible?



2011-04-04 18:34:26 +0200, Mikael Magnusson:
[...]
> >> > eval "$somevar=\$(pwd)"
> >> > or
> >> > eval "$somevar=\$PWD"
[...]
> >> How do you feel about this?
> >> : ${(P)somevar::=$PWD}
> > [...]
> >
> > Try after
> >
> > sudo ln -s . '/*'
> > cd '/*/*/*/*/*'
> > setopt globsubst
> >
> > ;-)
> >
> > (if you're lucky, it won't crash your machine).
> 
> Pretty sure globsubst breaks your idea too, but fine,
> : ${(P)~~somevar::=$PWD}
> In fact, globsubst pretty much breaks every hook function i have :P.
[...]

eval "$somevar=\$(pwd)"
or
eval "$somevar=\$PWD"

are POSIX and POSIX shells have globsubst and shwordsplit on.
The above will work regardless of the status of those options.

In POSIX shells, you need to quote variables to prevent
globsubst or shwordsplit, even in arguments to ":" because
globsubst can be very very resource intensive.

You can bring a machine to its knees with

: ${var=foo}

if $var is for instance /*/*/*/../../../*/*/*/../../../*/*/*

So, you should either use instead:

var=${var-foo}
or
: "${var=foo}"

In your example, if we have to accomodate users enabling
shwordsplit or globsubst (or running zsh in sh or ksh
emulation), we need

: "${(P)somevar::=$PWD}"

But

eval "$somevar=\$PWD"

is more legible and more portable.

-- 
Stephane





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