Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 26 Oct 2017 21:46:20 +0200
From:      Polytropon <freebsd@edvax.de>
To:        Ian Smith <smithi@nimnet.asn.au>
Cc:        freebsd-questions@freebsd.org, Manish Jain <bourne.identity@hotmail.com>
Subject:   Re: A request to segregate man pages for shell built-ins
Message-ID:  <20171026214620.bf8fcbf2.freebsd@edvax.de>
In-Reply-To: <20171027021115.A40402@sola.nimnet.asn.au>
References:  <mailman.113.1509019202.90583.freebsd-questions@freebsd.org> <20171027021115.A40402@sola.nimnet.asn.au>

next in thread | previous in thread | raw e-mail | index | archive | help
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@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, ...



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20171026214620.bf8fcbf2.freebsd>