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


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@cs.nyu.edu
ZZZzz /,`.-'`'    -.  ;-;;,_		igor@watson.ibm.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/


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