eval function not working anymore !?
Eric Blake
ericblake@comcast.net
Thu Sep 15 15:49:00 GMT 2005
>
> Hello,
>
> I have been using cygwin for several years now and I have several scripts
> tant do not work anymore since I installed the latest release of cygwin
> (doxnloaded last week).
> The reason is the eval function that I use quite a lot in such ways as :
eval is not a function, but a builtin.
>
> DOMAINE_LISTE="DOM1 DOM2 DOM3"
> DOM1_MODULES='D1_M1 D1_M2"
Well, I hope that was a copy-n-pasto, because otherwise it
would never work with mismatched quotes.
> DOM2_MODULES="D2_M1 D2_M2"
>
> for domain in $DOMAINE_LISTE
> do
> eval MODULES=$"${domain}_MODULES"
> ...
> done
>
> Before it was working fine, but now echo $MODULES returns "DOM1_MODULES" or
> "DOM2_MODULES" instead of "D1_M1 D1_M2" "D2_M1 D2_M2"
>
> Have you experience such a change ?
> Do you have an idea why ?
Yes - sh is now bash, and bash has a POSIX-allowed extension
where $" " has special meaning for purposes of string translation
($" is undefined by POSIX, and unimplemented by ash, so you
were lucky before).
> How can I work around this problem (another function to use ?)
Option 1: Fix your shell script to use POSIX compliant expressions
(basically, $" is non-portable in the first level of evaluation, so
quote the $ so that the second level of evaluation will see the
desired $DOM1_MODULES). Any of the following properly quotes
the leading $ (and there are other ways, too):
eval MODULES=\$"${domain}_MODULES"
eval MODULES="\$${domain}_MODULES"
eval MODULES='$'"${domain}"_MODULES
Option 2: Disable the bash extension in your script:
shopt -u extquote
--
Eric Blake
volunteer cygwin bash maintainer
--
Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple
Problem reports: http://cygwin.com/problems.html
Documentation: http://cygwin.com/docs.html
FAQ: http://cygwin.com/faq/
More information about the Cygwin
mailing list