A request to segregate man pages for shell built-ins

Ian Smith smithi at nimnet.asn.au
Fri Oct 27 12:56:33 UTC 2017


On Thu, 26 Oct 2017 21:46:20 +0200, Polytropon wrote:
 > 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:

 > >  > 	% 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.

Wwll you could do that .. but I'd expect it to be slower (untested).

 > >            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

Indeed, after posting I thought I should have added that :)

 > 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?

But see below ..

 > Oh, and nobody with a sane mind writes shell scripts in C Shell.
 > Of course I've done it. ;-)

Agreed, but I guess I'm not quite so insane :)  For one thing, I find 
csh's redirections confusing and less complete, so even interactively 
I'll do things to avoid csh syntax like (as a wild example):

 % sh -c 'for i in a b c; do echo $i; sleep 2; done 2>&1 >file'

 > >  > 	% 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.

However, as Carl Johnson since posted:

 > 'Which' is an external for sh so it can't show builtin commands.  Sh has
 > the builtin 'type' command which is the equivalent of 'which' for csh.

which was news to me.  So I tried something:

% sh
$ alias
$ type type
type is a shell builtin
$ type which
which is a tracked alias for /usr/bin/which
$
$ alias which=type
$ which which
which is an alias for type
$ type which
which is an alias for type
$ which test
test is a shell builtin
$ which echo
echo is a shell builtin
$
$ unalias which
$ which which
/usr/bin/which
$ which echo
/bin/echo
$ which test
/bin/test

So thanks for that, Carl ..

 > > 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... ;-)

Ability?  Just choose '/bin/csh' on entry, or type 'csh' once in SUM?
 
cheers, Ian


More information about the freebsd-questions mailing list