test -nt/-ot behavior

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

 



Hello,

The behavior of the test builtin's -nt and -ot operators differs
in an incompatible way from the behavior established by the
KornShell.

The -nt, -ot, and -ef operators of test originated from the
KornShell, they exist at least since ksh88. Their specified
behavior is as follows:

* file1 -nt file2 evaluates to true if only file1 exists or file1
  is newer than file2
* file1 -ot file2 evaluates to true if only file2 exists or file1
  is older than file2

This behavior is matched by the test builtin that is part of
bash, ksh93, pdksh 5.2.14, and the test utility that comes with
GNU coreutils.

Then there is the pdksh's test builtin in versions < 5.2.14 where
the -nt and -ot operators behaved differently until they got
"fixed" (it is listed in the changelog under bug fixes) in 1999
just before the last release 5.2.14. Here the behavior was as
follows:

* file1 -nt file2 evaluates to true if both file1 and file2 exist
  and file1 is newer than file2
* file1 -ot file2 evaluates to true if both file1 and file2 exist
  and file1 is older than file2

It has to be noted that the documented behavior of test in ksh93,
pdksh 5.2.14, bash, and GNU coreutils is not entirely correct,
rather than checking for the existence of a file they only check
if a stat on the file succeeds.

According to the posting of the ash sources on comp.sources.unix
in 1989 ash originally included a combined test/expr builtin and
a standalone version of the test command (which did not contain
-nt, -ot, and -ef). NetBSD apparently went with the latter as a
standalone utility and when ash was first ported to Linux in 1993
the "buggy" test builtin from pdksh was used (see the ash-0.2
source) and I suppose it was adopted for the later port that
became dash.  In 1994 NetBSD replaced its test utility with the
"buggy" version from pdksh, from there it went into OpenBSD and
in 1999 it was imported into FreeBSD.  The change that pdksh made
in 1999 was however never merged back into the standalone test
utility included in the BSDs or the builtin test contained in the
Linux ports of ash, however NetBSD and OpenBSD both contain ksh
versions derived from pdksh 5.2.14 in their base system resulting
in inconsistent behavior between /bin/test and the ksh builtin.

It should be noted that pdksh contains many other subtle
differences and is not really compatible to either ksh88 or
ksh93, the behavior introduced by the test builtin of earlier
pdksh versions is likely due to a misunderstanding of ksh88's
specified behavior which was later fixed.  So IMHO the
consequence for ash should be to either merge the fix from pdksh
or to drop -nt, -ot, and -ef altogether, I would prefer that
latter since I think silently changing the behavior in an
incompatible way is bad practice and these features are not
specified in POSIX anyway.

-- 
Guido Berhoerster
--
To unsubscribe from this list: send the line "unsubscribe dash" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [LARTC]     [Bugtraq]     [Yosemite Forum]     [Photo]

  Powered by Linux