[Top][All Lists]

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

Re: built-in '[' and '/usr/bin/[' yield different results

From: Eric Blake
Subject: Re: built-in '[' and '/usr/bin/[' yield different results
Date: Tue, 13 Nov 2018 11:54:29 -0600
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.3.0

On 11/13/18 10:29 AM, Service wrote:
     # ensure that file1 exists and that file2 does not exist

There's your problem. It is inherently ambiguous what timestamp to use when a file is missing (infinitely new or infinitely old, or always an error for not existing); bash's -nt picked one way, while other shells have picked the other. POSIX is silent on the matter (-nt is an extension outside of POSIX), so there is nothing portable you can rely on.

     /bin/touch file1
     /bin/rm -f file2
     # built-in
     if          [ file1 -nt file2 ]; then echo nt; else echo not_nt; fi
     # external
     if /usr/bin/[ file1 -nt file2 ]; then echo nt; else echo not_nt; fi

     # Output is as expected:

That is, bash's builtin '[' and coreutil's external '[' happened to pick the same thing: a missing file is treated as infinitely old.

     2. This does not work:

     # Put the above commands into a script, say check.sh
     # Run with: /bin/sh < check.sh
     # Or      : /bin/sh ./check.sh
     # Or      : /usr/bin/env ./check.sh

     # Output is always not ok:

Most likely, this is because your /bin/sh is not bash, but probably dash, and dash has picked a missing file as being treated as always an error. That does not make it a bug in bash, though, but a difference in behavior of your /bin/sh.

Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3266
Virtualization:  qemu.org | libvirt.org

reply via email to

[Prev in Thread] Current Thread [Next in Thread]