Shell
破折號“-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 程式碼的邏輯。您可以像這樣解決此行為:
$ dash -c 'touch 1.txt; [ ! -f 3.txt ] || [ 1.txt -nt 3.txt ]; echo $?' 0
但為什麼需要這樣做呢?為什麼 Dash 會選擇這個邏輯?在某些情況下使用 Dash 邏輯是否有意義?
您的問題相當固執,但在我看來,破折號的邏輯更有意義。如果您想比較一個文件是否比另一個文件新,則應該要求兩個文件都存在。這顯然不是 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