破折号“-nt”行为

破折号“-nt”行为

我能想到的用例是-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 手册中显然不是这样的。

6.4 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

相关内容