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 Date: Wed, 17 Nov 2004 12:25:31 -0500 (EST) From: Igor Pechtchanski Reply-To: cygwin AT cygwin DOT com To: Reini Urban cc: Geoffrey KRETZ , cygwin AT cygwin DOT com Subject: Re: long command executed via a variable fails In-Reply-To: <419B769E.4060905@x-ray.at> Message-ID: References: <419B70A9 DOT 6020203 AT 4js DOT com> <419B769E DOT 4060905 AT x-ray DOT at> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Scanned-By: MIMEDefang 2.39 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 -- http://cs.nyu.edu/~pechtcha/ |\ _,,,---,,_ pechtcha AT cs DOT nyu DOT edu ZZZzz /,`.-'`' -. ;-;;,_ igor AT watson DOT ibm DOT com |,4- ) )-,_. ,\ ( `'-' Igor Pechtchanski, Ph.D. '---''(_/--' `-'\_) fL a.k.a JaguaR-R-R-r-r-r-.-.-. Meow! "The Sun will pass between the Earth and the Moon tonight for a total Lunar eclipse..." -- WCBS Radio Newsbrief, Oct 27 2004, 12:01 pm EDT -- 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/