Another thing V7 Unix gave us is environment variables
Simon Tatham recently wondered "Why is PATH called PATH?". This made me wonder the closely related question of when environment variables appeared in Unix, and the answer is that the environment and environment variables appeared in V7 Unix as another of the things that made it so important to Unix history (also).
Up through V6, the exec system call and family of system calls took
two arguments, the path and the argument list; we can see this in
both the V6 exec(2)
manual page and
the implementation of the system call in the kernel. As
bonus trivia, it appears that the V6 exec() limited you to 510
characters of arguments (and probably V1 through V5 had a similarly
low limit, but I haven't looked at their kernel code).
In V7, the exec(2)
manual page now
documents a possible third argument, and the kernel implementation
is much more complex, plus
there's an environ(5)
manual page about it.
Based on h/param.h, V7
also had a much higher size limit on the combined sized of arguments
and environment variables, which isn't all that surprising given
the addition of the environment. Commands like login.c were
updated to put some things into the new environment; login sets a
default $PATH and a $HOME, for example, and environ(5)
documents various other uses (which I haven't checked in the source
code).
This implies that the V7 shell is where $PATH first appeared in Unix, where the manual page describes it as 'the search path for commands'. This might make you wonder how the V6 shell handled locating commands, and where it looked for them. The details are helpfully documented in the V6 shell manual page, and I'll just quote what it has to say:
If the first argument is the name of an executable file, it is invoked; otherwise the string `/bin/' is prepended to the argument. (In this way most standard commands, which reside in `/bin', are found.) If no such command is found, the string `/usr' is further prepended (to give `/usr/bin/command') and another attempt is made to execute the resulting file. (Certain lesser-used commands live in `/usr/bin'.)
('Invoked' here is carrying some extra freight, since this may not involve a direct kernel exec of the file. An executable file that the kernel didn't like would be directly run by the shell.)
I suspect that '$PATH' was given such as short name (instead of a longer, more explicit one) simply as a matter of Unix style at the time. Pretty much everything in V7 was terse and short in this style for various reasons, and verbose environment variable names would have reduced that limited exec argument space.