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>