delorie.com/archives/browse.cgi   search  
Mail Archives: cygwin/2004/11/18/12:37:42

Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm
List-Subscribe: <mailto:cygwin-subscribe AT cygwin DOT com>
List-Archive: <http://sourceware.org/ml/cygwin/>
List-Post: <mailto:cygwin AT cygwin DOT com>
List-Help: <mailto:cygwin-help AT cygwin DOT com>, <http://sourceware.org/ml/#faqs>
Sender: cygwin-owner AT cygwin DOT com
Mail-Followup-To: cygwin AT cygwin DOT com
Delivered-To: mailing list cygwin AT cygwin DOT com
Message-ID: <419CDDCE.3020009@4js.com>
Date: Thu, 18 Nov 2004 18:37:18 +0100
From: Geoffrey KRETZ <gk AT 4js DOT com>
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.7.1) Gecko/20040707
MIME-Version: 1.0
To: Cygwin List <cygwin AT cygwin DOT com>
Subject: Re: long command executed via a variable fails (SOLVED)
References: <419B70A9 DOT 6020203 AT 4js DOT com> <419B769E DOT 4060905 AT x-ray DOT at> <Pine DOT GSO DOT 4 DOT 61 DOT 0411171208400 DOT 1017 AT slinky DOT cs DOT nyu DOT edu> <419B8E8D DOT 6030502 AT 4js DOT com>
In-Reply-To: <419B8E8D.6030502@4js.com>
X-IsSubscribed: yes

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 -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019