Mail Archives: cygwin/2004/11/18/12:37:42
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/
- Raw text -