NetBSD-Bugs archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: bin/54803: /bin/sh: apparent regression with "type -p" (alias tracking?)

The following reply was made to PR bin/54803; it has been noted by GNATS.

From: Robert Elz <kre%munnari.OZ.AU@localhost>
Subject: Re: bin/54803: /bin/sh: apparent regression with "type -p" (alias tracking?)
Date: Sat, 28 Dec 2019 20:29:00 +0700

     Date:        Sat, 28 Dec 2019 01:30:02 +0000 (UTC)
     From:        "David H. Gutteridge" <>
     Message-ID:  <>
   |  It looks to me that this was a regression introduced in v. 1.53 of
   |  exec.c. But I may well be missing something.
 Well, yes, as in the cvs log says (which I failed to remember earlier):
   3. Stop the "type" builtin inheriting the args (-pvV) that "command" has
      (which it did, as when -v -or -V is used with command, it and type are
      implemented using the same code).
 The history here is that "command -v" (and "command -V") are implemented
 by the same code as implements "type".   Exactly the same code.  "command"
 has -v -V and -p as options, therefore our implementation of "type" did
 as well.   However type was never documented to take any options, nor is
 the posix "type" command specified as taking any options (they're not
 disallowed, just there are none).
 I tested a bunch of other shells ... the ksh variants, bash, and somewhat
 surprisingly yash, all allow the -p option (bash alone also permits -P), the
 FreeBSD shell treats options as just more command names (I'm not sure that's
 strictly correct), dash and bosh act as we do now, and give a usage message.
 The ksh variants allow -p, as for them "type" is just an alias of "whence"
 which does have options (including -p) and yash makes "type" the equivalent of
 "command -V" (and so permits the options that "command" takes (which includes 
 Note that for bash, the -P option to type is more or less what the others
 give you with -p (path search, though exactly what that implies is not
 consistent), the "-p" option to bash makes the output less verbose (more
 suitable for use in a script, just as the -p option behaves in things like
 I am not sure what is best here, I would certainly not recommend using "type"
 for anything that matters - its output format isn't (anywhere) defined, its
 exit status is defined but just as "0: no errors, >0: an error occurred"
 but there's no specification of what kind of error that might be - certainly
 it is not specified that "not found" is an error for which a status != 0
 will be returned.
 I'd use "command" (probably "command -v" rather than -V though one of those
 options is necessary) rather than "type" for the purpose described, that
 one at least specifies that the exit status (of command -v or -V) is != 0
 when the command named is not found, and it is specified what -p means.
 About the only thing missing from "command -[Vv]" is that command permits
 just one command name, whereas "type" allows many.  As described I don't
 think that is likely to matter.
 So, I am not sure what we should do here (if anything) - while the -p (and
 -v and -V) options to type did go away, they were never docmuented as
 existing, that they did was just an implementation artifact - a bug if you
 like - to be fixed (as both the FreeBSD shell and dash have apparently done,
 though in different ways), which is what happened.
 Reverting to the previous behaviour is trivial - it just means deleting (or
 altering) the check for options intended for "command" being given when the
 command being executed is "type".
 It might not work quite the same way as it did, as there were other bug
 fixes to the "command" command, which will have (cannot avoid having with
 the current implementation) a flow through to type but given how imprecisely
 "type" is specified (and how different the implementations) it would
 probably work well enough for the purpose if it failed to give a usage
 message for "-p".
 I am open to receiving opinions, but my default state unless there is
 considerable demand, is to keep things as they are now (that is, "type"
 allows no options).   That is do do what our manpage says:
    type [name ...]
             Interpret each name as a command and print the resolution of the
             command search.  Possible resolutions are: shell keyword, alias,
             shell built-in, command, tracked alias and not found.  For aliases
             the alias expansion is printed; for commands and tracked aliases
             the complete pathname of the command is printed.
 ps: at some stage the "tracked alias" output variant which is some ksh
 invented terminology, that almost no-one really comprehends (it just means
 a filesystem command that was located in the hash table, rather than by
 actually doing a path search) is likely to go away, as it leads to lunacy like:
 	[jinx]{2}$ type whois
 	whois is /usr/bin/whois
 	[jinx]{2}$ type whois
 	whois is a tracked alias for /usr/bin/whois
 as the first "type whois" conveniently adds the "whois" command to the
 hash table as a side effect of the path search which located it, so the
 first time "whois" was not in the hash table, and so is reported as just
 the command, whereas the next time it is there already, and is reported
 as a "tracked alias" instead.   Note that you have to be looking for a
 command that is not in the hash table initially to see this effect, which
 is why I chose "whois" as the target.

Home | Main Index | Thread Index | Old Index