-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がこのロジックを選択したのはなぜですか?特定の場合にダッシュロジックを使用することは理にかなっていますか?
あなたの質問はかなり意見が分かれていますが、私の意見ではダッシュの論理の方が理にかなっています。ファイルが別のファイルよりも新しいかどうかを比較する場合は、両方のファイルが存在する必要があります。ただし、bashマニュアルに示されているように、これは明らかに当てはまりません。
file1 -nt file2
File1がfile2よりも新しい(変更日による)場合、またはfile1が存在し、file2が存在しない場合はTrue。
file1 -nt file2
File1とfile2が存在し、file1がfile2よりも新しい場合はTrue。
なぜそれが必要なのですか?
なぜ両方のファイルが存在する必要があるのですか?より良い質問は、なぜそうではないのですか? file1が存在しないファイルよりも新しい場合、なぜ比較したいのですか?これは、file1が存在するかどうかをテストするための複雑な方法にすぎません。あるファイルが別のファイルよりも新しいかどうかを実際に比較しようとしている場合、それらのファイルの1つが欠落していると、エラーが発生する可能性がある問題である可能性があります。
他の比較演算子では意味がありますか?
ファイルを存在しないファイルと比較することは、整数をnull値と比較するようなものです。 [[ 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