我能想到的用例是-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 代码的逻辑。您可以像这样解决此行为:
$ dash -c 'touch 1.txt; [ ! -f 3.txt ] || [ 1.txt -nt 3.txt ]; echo $?'
0
但为什么需要这样做呢?为什么 Dash 会选择这个逻辑?在某些情况下使用 Dash 逻辑是否有意义?
您的问题相当固执,但在我看来,破折号的逻辑更有意义。如果您想比较一个文件是否比另一个文件新,则应该要求两个文件都存在。这显然不是 bash 手册中指出的情况。
6.4 Bash 条件表达式
破折号手册页
为什么这两个文件都需要存在?一个更好的问题是为什么不呢?为什么要比较 file1 是否比不存在的文件新?这只是测试 file1 是否存在的一种复杂方法。如果您真的想比较一个文件是否比另一个文件新,那么如果其中一个文件丢失,这可能是一个应该导致错误的问题。
与其他比较运算符一起有意义吗?
将文件与不存在的文件进行比较有点像将整数与空值进行比较。如果
[[ 1 -gt "" ]]
评估为 true 是否有意义?那么 bash 认为这也有道理......