我能想到的用例是-nt
,如果文件太旧或不存在,则更新文件。 Bash 可以很好地处理这个问题:
$ bash -c 'touch 2.txt; sleep 1; touch 1.txt; [ 1.txt -nt 2.txt ]; echo $?;
[ 1.txt -nt 3.txt ]; echo $?'
0
0
然而,只有当两个文件都存在时,Dash 才会按预期工作:
$ dash -c 'touch 2.txt; sleep 1; touch 1.txt; [ 1.txt -nt 2.txt ]; echo $?;
[ 1.txt -nt 3.txt ]; echo $?'
0
1
我试图理解达世币代码的逻辑。您可以像这样解决此问题:
$ dash -c 'touch 1.txt; [ ! -f 3.txt ] || [ 1.txt -nt 3.txt ]; echo $?'
0
但为什么需要这样做呢?达世币为何选择这样的逻辑?在某些情况下使用 Dash 逻辑是否有意义?
答案1
你的问题相当固执己见,但在我看来,达什的逻辑更有意义。如果您想比较一个文件是否比另一个文件新,则两个文件都存在应该是一个要求。但 bash 手册中显然不是这样的。
文件1 -nt 文件2
如果 file1 比 file2 新(根据修改日期),或者 file1 存在而 file2 不存在,则为 True。
文件1 -nt 文件2
如果 file1 和 file2 存在并且 file1 比 file2 新,则为 true。
为什么需要这个?
为什么这两个文件都需要存在?更好的问题是为什么不呢?为什么要比较 file1 是否比不存在的文件新?这只是测试 file1 是否存在的一种复杂方法。如果您确实想比较一个文件是否比另一个文件新,那么如果其中一个文件丢失,则可能会导致错误。
它与其他比较运算符有意义吗?
将文件与不存在的文件进行比较有点像将整数与空值进行比较。如果[[ 1 -gt "" ]]
评估为 true是否有意义? bash 认为这也有道理......
$ bash -c '[[ 1 -gt "" ]] && echo yes'
yes
$ dash -c '[ 1 -gt "" ] && echo yes'
dash: 1: [: Illegal number:
$ sh -c '[ 1 -gt "" ] && echo yes'
sh: line 0: [: : integer expression expected