Subject: Shell behaviour regarding PATH
To: None <tech-userlevel@netbsd.org>
From: Lucio De Re <lucio@proxima.alt.za>
List: tech-userlevel
Date: 02/09/2000 13:09:17
I've raised this before, but I somehow wasn't convinced last time.

From the exec(2) man page:

     The functions execlp() and execvp() will duplicate the actions of the
     shell in searching for an executable file if the specified file name does
     not contain a slash ``/'' character.  The search path is the path speci-
     fied in the environment by ``PATH'' variable.  If this variable isn't
     specified, the default path ``/bin:/usr/bin:'' is used.  ...

I'm not sure (I haven't looked at the sources) whether /bin/sh uses
exec(2) or viceversa, but the above behaviour has an unpleasant
side effects reflected in all common shells under NetBSD: if I type
"bin/prog", the assumed target is not one of the directories in
the PATH, but rather the current directory.  There are many aspects
of this behaviour I dislike to the point that I consider them harmful:

1. This defeats the protection afforded "root" by not including "." in the
   PATH.  Even though it is a less likely weakness, this strikes me as
   inappropriate and inconsistent.
2. This behaviour is identical to typing "./bin/prog" and therefore the
   reverse is not available.  In other words, I can override the PATH
   selection by typing "./prog", thus being offered two distinct alternatives,
   whereas the moment the name has a "/" in it, these options are merged
   into an alternative I find unappetising, with no access to the
   alternative.  Even the law of least surprise is defeated by this.
3. I cannot adopt Plan 9's approach of using named subdirectories of
   /bin to hold executables for various packages, which I find a very
   sensible approach to organising a multi-platform environment. This
   need not appeal to everyone, but in my investigations has stood up
   best as a structure.  Plan 9 is documented at
      <http://plan9.bell-labs.com/plan9/>
   and despite some philosophical clashes with NetBSD, is also my
   favorite model on which to base platform independence in a Unix-like
   environment.
   (By way of llustration, I may have installed a seldom used copy of
   gmake: in Plan 9 I would type "gmake/make" to execute it, whereas
   under NetBSD I have to use /usr/bin/gmake/make to achieve the same
   result; if gmake/make becomes very popular, in Plan 9 I would union
   mount /usr/bin/gmake on /usr/bin to override the standard make.)
4. I don't think that treating "bin/prog" as identical to "./bin/prog"
   is semantically valid.  Besides removing an option as mentioned
   in 2.  above, it is also inconsistent with the otherwise clear
   distinction between "relative" and "absolute" pathnames.  It is
   my proposition that the exec(2) (and shell) implementation should
   use this distinction, rather than the arbitrary _presence_ of
   a "/" somewhere in the name to decide whether to search the PATH
   or not.

End of rant.  I am really curious to know whether most participants on
this list feel my arguments above are empty, and if so, why.  And, yes,
I'll happily apply myself to changing the behaviour, if I can be sure
that I don't have to repeat these changes every time an upgrade occurs.

As for borrowing the directory hierarchy from Plan 9 "lock, stock and
barrel", I'm waiting for the bugs to be ironed out of the "union"
filesystem (_that_ bit I haven't the skills and time for) before
embarking on an _alternative_ hierarchy campaign.  My hope is to be
able to choose at installation time which of two conventions to adopt
and to make sure they are both equally workable.  But not just yet :-)

++L