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