This is the mail archive of the cygwin mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: long command executed via a variable fails (SOLVED)


Thx to Igor and Reini for their help. My shell script works on UNIX and windows via Cygwin now.
The good syntax is the one given by Igor : if ! eval "$cmd"; then .....


Geoffrey

Geoffrey KRETZ wrote:

Actually my original unix script use :

if ! $cmd; then
...
fi

AND

if ! eval $cmd; then
...
fi

And it works perfectly

I'm forced to use eval because I'm of the structure of my $cmd variable.

Just a few samples :
- cmd="$LDPRELOAD $FGLRUN ${mainname}.42r -db $dbname -dt $dbtype -ho $QAHOST $dvmversionopt -dc $dbcode -dynamic -tn 99",
with LDPRELOAD = "LD_PRELOAD='$FGLDIR/bin/dbmdb28x.so'" and $FGLRUN is a runner use to run an executable
- cmd ="$COMPILATOR fglmksdl -d $dbcode $mksdlopt"
with $COMPILATOR = "INFORMIXC='$FGLCC -shared'", $FGLCC is a compilator with some option (ie: gcc -mlp64 or cc -Wl,-G,-dy) and fglmksdl a (my company) command that generate shared libraries.


I've got to use carefully the quotes and double-quotes and without eval, I doesn't work on Unix.

Whatever, I'll try : eval "$cmd" and read the sh man page ;)

Geo


Igor Pechtchanski wrote:


On Wed, 17 Nov 2004, Reini Urban wrote:



Geoffrey KRETZ schrieb:


I've got a problem with a shell script used with Cygwin 1.5.10-3 on W2000
SP4 and W XP SP 2.


The following part of code works on all the Unix I've tested (HP-UX/AIX/Sun
Solaris/Linux).


With Cygwin, it doesn't :(

*Code:*

cmd="long shell command with differents parameters"
if [ ! eval $cmd ]; then
echo "Error : $cmd"
exit 1
fi


This doesn't do what you thought it would. Please read the sh manual on the "if" builtin command. You're actually invoking the "[" command with the parameters "! eval $cmd", which is not what you want.



instead of eval $cmd, i've tried :
- `eval $cmd`
- eval `$cmd`
- $cmd
- `$cmd`


Most of the above (except $cmd) show that you don't understand much about
command substitution. Please read the sh man page carefully.


BTW, given that sh's "eval" behaves differently from bash's, you should
actually use 'eval "$cmd"' (note the double quotes).



I've also try with a function without more success.

*Code:*

execCmd()
{
eval $cmd
return $?
}

cmd="long shell command with differents parameters"
if [ ! execCmd ]; then
echo "Error : $cmd"
exit 1
fi


This doesn't work since $cmd is unset in the function. Either define the
function after setting cmd, or pass $cmd as a parameter, e.g.,


execCmd() {
 cmd="$1"; shift
 eval "$cmd"
 return $?
}

BTW, your "if" test suffers from the same problem as your original one.
Ditch the "[".."]".



The only way I've find is :

*Code:*

cmd="long shell command with differents parameters"
eval $cmd
if [ $? -ne 0 ]; then
echo "Error : $cmd"
exit 1
fi


Note that this works because you're actually using "[".."]" in the right way here.



Is it possible to make it work like the two first exemple or I'm
obliged to use the third solution ?

FAQ: http://cygwin.com/faq/faq_3.html#SEC43 cygwin's /bin/sh is ash, on most other platforms it is /bin/bash.

If you want it to behave it exactly like on other platforms, and you use
bash specific constructs, use the /bin/bash shebang.


Well, eval is not a bash-specific construct. It does behave slightly
differently in ash than in bash, but in this particular case, switching to
bash wouldn't have helped the OP. Reading the man pages for bash and sh
would have. :-)
HTH,
Igor




--
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/



--
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/


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]