DASH Shell discussions
 help / color / mirror / Atom feed
From: Guido Berhoerster <guido+kernel.org@berhoerster.name>
To: dash@vger.kernel.org
Subject: test -nt/-ot behavior
Date: Sun, 21 Feb 2010 13:21:01 +0100	[thread overview]
Message-ID: <20100221122100.GA9005@wopr.local.invalid> (raw)


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

             reply	other threads:[~2010-02-21 12:28 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-02-21 12:21 Guido Berhoerster [this message]
2010-02-21 13:10 ` test -nt/-ot behavior Oleg Verych
2010-02-22  6:50 ` Herbert Xu
2010-02-22 10:33   ` Guido Berhoerster
2010-02-23  2:32     ` Herbert Xu

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20100221122100.GA9005@wopr.local.invalid \
    --to=guido+kernel.org@berhoerster.name \
    --cc=dash@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox