Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm List-Subscribe: List-Archive: List-Post: List-Help: , 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 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 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> <419B8E8D DOT 6030502 AT 4js DOT com> In-Reply-To: <419B8E8D.6030502@4js.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit 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/