私が考えることができるユースケースは、-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
しかし、なぜこれが必要ですか?ダッシュがこのロジックを選択したのはなぜですか?特定の状況でダッシュロジックを使用するのは妥当ですか?
答え1
あなたの質問はかなり独善的ですが、私はDashのロジックをより理解しています。あるファイルが別のファイルより最新であるかどうかを比較するには、両方のファイルが必要です。しかし、これはbashマニュアルでは明らかにそうではありません。
ファイル1-ntファイル2
file1 が file2 よりも最新であるか (変更日時)、file1 が存在し、file2 がない場合は真です。
ファイル1-ntファイル2
file1 と file2 が存在し、file1 が file2 よりも最新の場合は真です。
これはなぜ必要ですか?
両方のファイルが存在する必要があるのはなぜですか?より良い質問はなぜならないのかということです。存在しないファイルより最新であることを確認するためにfile1を比較するのはなぜですか?これはfile1が存在するかどうかをテストするための洗練された方法です。あるファイルが別のファイルより最新であるかどうかを比較しようとすると、ファイルの1つが欠落しているとエラーが発生する可能性があります。
他の比較演算子に関連していますか?
存在しないファイルとファイルを比較することは、整数をnull値と比較するのと似ています。それが[[ 1 -gt "" ]]
事実と評価されていると言われますか? 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