[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:
nt
nt
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:
not_nt
nt
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