diff argument handling feature that's actually very old
Some time ago I stumbled over a useful feature in the
diff on our
Linux machines (ie, GNU diff), where '
diff exim4.conf /etc/exim4/'
is the same as '
diff exim4.conf /etc/exim4/exim4.conf'. As a
sysadmin, I routinely diff versions of configuration files to do
things like verify that my intended new changes are actually the
only changes, so this feature routinely saves me from having to
repeat the file name. I was all set to write a Wandering Thoughts entry about how this was a handy GNU diff addition, even
if it's not quite pure in the Unix way, and then I decided to check
what the Unix standard had to say,
just to be sure. To my surprise, the standard's manpage for
explicitly requires this behavior. Then I looked at the history of
diff and got another surprise.
The standard describes it in the "Operands" section, in the usual sort of standards language:
If only one of file1 and file2 is a directory, diff shall be applied to the non-directory file and the file contained in the directory file with a filename that is the same as the last component of the non-directory file.
Once I looked, this diff behavior turned out to go back quite far
in Unix history, much further than I thought. This behavior is first
specifically mentioned in the V7
If file1 (file2) is a directory, then a file in that directory whose file-name is the same as the file-name of file2 (file1) is used.
Diff itself seems to appear in V5 Unix (there's no
in the V4 manuals that tuhs.org has).
However, the V5 and V6 manpage don't mention this behavior and the
diff source code doesn't seem to contain it on a casual look;
it just directly opens the files you gave it and that's it.
(There are Unix V6 emulators online that run in your browser, and
diff out in one of them suggests that this is how it really
works. You can get some odd results, because you can actually
read() directories in early Unixes.)
On the one hand, I'm amused and pleased that this handy feature of
diff goes as far back as it does, all the way to V7. On the other
hand, I wish that I'd noticed it earlier, since it's been there all
(And this is a useful reminder to me that not all of the little nice convenience features found in modern Unix come from GNU.)