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