Shell

破折號“-nt”行為

  • May 12, 2018

我能想到的案例是-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 條件表達式

文件 1 -nt 文件 2

如果 file1 比 file2 新(根據修改日期),或者如果 file1 存在而 file2 不存在,則為真。

破折號手冊頁

文件 1 -nt 文件 2

如果 file1 和 file2 存在並且 file1 比 file2 新,則為真。


為什麼需要這樣做?

為什麼這兩個文件都需要存在?一個更好的問題是為什麼不呢?為什麼要比較 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

引用自:https://unix.stackexchange.com/questions/443428