Jim Meyering <jim <at> meyering.net> writes: > > > > Ouch - this looks like a POSIX compliance bug in exec > > This is on 3.9 GENERIC#617 i386 OpenBSD, > and /bin/sh is a hard link to /bin/ksh. > "strings" says it's PDKSH: > > PD KSH v5.2.14 99/07/13.2
Hmm - cygwin also has pdksh 5.2.14, but there, mknod is not builtin. At any rate, I was able to reproduce this with other builtins, so here's what I'm considering adding to autoconf. Any comments before I check it in? >From 53403805c39ace610782a1b54c257b00844f61fd Mon Sep 17 00:00:00 2001 From: Eric Blake <[EMAIL PROTECTED]> Date: Wed, 16 Apr 2008 10:10:31 -0600 Subject: [PATCH] Document pdksh exec behavior. * doc/autoconf.texi (Limitations of Builtins) <exec>: New subsection. Discovered by Jim Meyering. Signed-off-by: Eric Blake <[EMAIL PROTECTED]> --- ChangeLog | 7 ++++++ doc/autoconf.texi | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+), 0 deletions(-) diff --git a/ChangeLog b/ChangeLog index b1d9a4e..9d9d04e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2008-04-16 Eric Blake <[EMAIL PROTECTED]> + + Document pdksh exec behavior. + * doc/autoconf.texi (Limitations of Builtins) <exec>: New + subsection. + Discovered by Jim Meyering. + 2008-04-14 Ralf Wildenhues <[EMAIL PROTECTED]> * tests/autotest.at (AT_CHECK_AT): Allow to pass additional diff --git a/doc/autoconf.texi b/doc/autoconf.texi index 8b10387..9a381ee 100644 --- a/doc/autoconf.texi +++ b/doc/autoconf.texi @@ -13945,6 +13945,69 @@ but portable scripts should not rely on this. You should not rely on @code{LINENO} within @command{eval}. @xref{Special Shell Variables}. [EMAIL PROTECTED] @command{exec} [EMAIL PROTECTED] ----------------- [EMAIL PROTECTED] @command{exec} +Posix divides the set of shell built-ins into two groups. Special +built-ins (such as @command{exit}) must impact the environment of the +current shell, and need not be available through @command{exec}. +Regular built-ins (such as @command{echo} or @command{cd}) must not +propogate variable assignments to the environment of the current shell, +and must also be available through @command{exec} (although the +functionality may be pointless if not done in the context of the current +shell). According to this distinction, it should always be possible to +use @command{exec} to invoke an actual executable rather than a regular +built-in: + [EMAIL PROTECTED] +$ @kbd{sh -c 'printf --version' | head -n1} +sh: line 0: printf: --: invalid option +printf: usage: printf [-v var] format [arguments] +$ @kbd{sh -c 'exec printf --version' | head -n1} +printf (GNU coreutils) 6.10 [EMAIL PROTECTED] example + +Many systems lack executable replacements for all of their regular +built-ins (fortunately, the missing executables are usually the ones +that make little sense to execute outside of the current shell +environment): + [EMAIL PROTECTED] +$ @kbd{sh -c 'exec cd /tmp'} +sh: line 0: exec: cd: not found [EMAIL PROTECTED] example + +On the other hand, @command{pdksh} 5.2.14 refuses to execute the +executable replacement, using the built-in no matter what: + [EMAIL PROTECTED] +$ @kbd{pdksh -c 'exec true --version'} +$ @kbd{sh -c 'exec true --version'} +true (GNU coreutils) 6.10 [EMAIL PROTECTED] example + [EMAIL PROTECTED] +This has the interest effect that @command{pdksh} can use @command{exec} +on special built-ins, even though Posix doesn't require it: + [EMAIL PROTECTED] +$ @kbd{sh -c 'exec exit 2' || echo $?} +sh: line 0: exec: exit: not found +127 +$ @kbd{pdksh -c 'exec exit 2' || echo $?} +2 [EMAIL PROTECTED] example + +When it is desired to avoid a regular shell built-in, the workaround is +to use some other forwarding command, such as @command{nice}, that will +ensure a path search: + [EMAIL PROTECTED] +$ @kbd{pdksh -c 'exec true --version' | head -n1} +$ @kbd{pdksh -c 'nice true --version' | head -n1} +true (GNU coreutils) 6.10 [EMAIL PROTECTED] example + @item @command{exit} @c ----------------- @prindex @command{exit} -- 1.5.5