A request to segregate man pages for shell built-ins
Polytropon
freebsd at edvax.de
Thu Oct 26 19:47:10 UTC 2017
On Fri, 27 Oct 2017 03:02:17 +1100 (EST), Ian Smith wrote:
> In freebsd-questions Digest, Vol 699, Issue 4, Message: 3
> On Wed, 25 Oct 2017 15:16:47 +0200 Polytropon <freebsd at edvax.de> wrote:
>
> > On Wed, 25 Oct 2017 02:23:23 +0000, Manish Jain wrote:
> > > [...]
> > > (Note : some built-ins (e.g. 'test') do have their own man pages)
> >
> > Well, test is a binary, a separate program, not a builtin. ;-)
> >
> > % which test
> > /bin/test
> >
> > % which [
> > /bin/[
>
> % which test
> /bin/test
> % sh
> $ which test
> /bin/test
>
> These results are correct for test, but it _is_ builtin to sh(1):
>
> [ A built-in equivalent of test(1).
> test A built-in equivalent of test(1).
Yes, this is true as long as the script uses [ or test. Some do
explicitely call /bin/test. I'm almost sure this isn't true anymore
on today's modern FreeBSD, but older UNIX scripts occassionally
were constructed in such a way that they called the binaries
explicitely with the full path. Maybe this has been some portability
issue.
> Fortunately - or it'd be much slower with, um, testing. So which isn't
> aware of the sh(1) builtin (since sh(1) has no 'which' builtin, so uses
> which(1)) .. whereas csh(1) has builtin which but no 'test' (as such,
> though all test's, um, tests can be done in csh). Easily confusing, eh?
>
> Command External csh(1) sh(1)
> echo Yes Yes Yes
> test Yes No Yes
To complete that table:
Command External csh(1) sh(1)
which Yes Yes No
So the result of the command is a bit confusing as "which", no
matter if being internal or external, is showing the binary as
a result whereas it should show builtin. Maybe this is another
"fight" between external and builtin?
Oh, and nobody with a sane mind writes shell scripts in C Shell.
Of course I've done it. ;-)
> > Of course, [ and test are actually one and the same binary.
>
> And the builtin test in sh(1) is correctly covered by test(1).
Yes, sh implements it as per the manpage.
> > Keep in mind some shells also offer a builtin replacement for
> > an existing binary. A good example is echo where a binary exists,
> > but the C Shell has its own internal echo, while BASH uses the
> > binary one:
> >
> > % which echo
> > echo: shell built-in command.
> >
> > $ which echo
> > /bin/echo
>
> Again, despite that, echo _is_ builtin to sh(1) - and has more options.
That is correct (even though sh's "which echo" reports the binary);
sh's echo supports escape sequences using the -e option, while the
binary doesn't.
> > In such a case, what should "man echo" show?
>
> Among other things, see builtin(1)" .. oh, it already does.
>
> Perhaps sh(1) could use a smarter 'which' that exposes its own builtins
> such as these two more readily - but who dares mess with sh(1) ? :)
Interactively? Probably only the poor souls dropped into
maintenance mode (single user mode) without the ability to
start a more comfortable interactive shell... ;-)
--
Polytropon
Magdeburg, Germany
Happy FreeBSD user since 4.0
Andra moi ennepe, Mousa, ...
More information about the freebsd-questions
mailing list