Stefano Lattarini stefano.lattar...@gmail.com wrote:
Hi Ralf.
A new version of the patch is attached. It's still not definitive,
but I hope most things are settled by now.
And, of course, they're not. Sigh.
With FreeBSD-7.2 /bin/sh, the construct:
if eval $run_evald_cmd; then
run_exitcode_got=0
else
run_exitcode_got=$?
fi
causes the shell to exit if `set -e' is on.
Minimal testcase exposing the bug:
$ /bin/sh -ec 'if false; then :; else :; fi; echo OK'; echo $?
OK
0
$ /bin/sh -ec 'if eval false; then :; else :; fi; echo OK'; echo $?
OK
1
l thought to revert to the uglier form:
run_exitcode_got=0
eval $run_evald_cmd || run_exitcode_got=$?
but this does not work either. Minimal testcase:
/bin/sh -ec 'false || :; echo OK'; echo $?
OK
0
/bin/sh -ec 'eval false || :; echo OK'; echo $?
1
Finally I settled to the following code:
if (eval exec $run_evald_cmd); then
run_exitcode_got=0
else
run_exitcode_got=$?
fi
which works, and has also the advantage of ensuring to run only
external programs, not builtins or shell functions.
After testing on FreeBSD and re-testing on Debian, I will send an
amended patch (and let's hope it will work eventually).
In the meantime...
Your run_command already has an -e option. If we're going to
return the exit status anyway from the function, then we wouldn't
need that -e *at all*, we could just return whatever status the
command caused.
So if it pleases you better, then we can change it to either of
the following:
- '-e ignore' ignores the status of the command; run_command
returns it;
- no '-e' just lets run_command return the status of the command,
rather than checking the command against zero.
I prefer the first, but only on the grounds that more typing is
done only in the rare case.
I thought about it, and now I strongly agree with you: adding
another subroutine is going to make things unnecessarly
complicated. But I'd prefer that `run_command -e IGNORE' continues
to do what it states, e.g. ignore the failures instead of making
the test case abort if `set -e' is on. Instead, what about adding
support for a new special argument to `-e', say `RETURN' (which is
what I did in the attached patch)? It's easy, far less obtrusive
than adding another function, and it also keeps the extra-typing
low (no need to ever add `-e 0'). Objections?
I went on and implemented `-e RETURN'. Hope you're OK with it.
Regards,
Stefano