Reply to message «Re: is variable with variable name possible?», sent 00:50:02 05 April 2011, Tuesday by Stephane Chazelas: > 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}" If we are talking about script, then you should use `emulate -L zsh' somewhere at the top. This will deal with all possible weird options that are set by user. > 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. Somebody said that $somevar contains nothing harmful? Original message: > 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.