web-dev-qa-db-ja.com

なぜ `sort <" $ f1 "`は `sort-" $ f1 "`よりも優先され、なぜこれは `sort" $ f1 "`よりも優先されるのですか?

から https://unix.stackexchange.com/a/458074/674

コマンドに任意の引数を渡すときは--を使用することを忘れないでください(または可能な場合はリダイレクトを使用します)。したがって、sort -- "$f1"ではなくsort < "$f1"以上のsort "$f1"を使用してください。

--とリダイレクトを使用することが望ましいのはなぜですか?

sort < "$f1"sort -- "$f1"よりも優先される理由

sort -- "$f1"sort "$f1"よりも優先される理由

ありがとう。

30
Tim
sort "$f1"

$f1で始まる-の値、またはsortの場合はここで失敗します。+で始まるものもあります(たとえば、-o/etc/passwdと呼ばれるファイルに重大な影響を与える可能性があります)。

sort -- "$f1"

--はオプションの終わりを示します)これらの問題のほとんどに対処しますが、-sortが代わりにそのstdinを意味すると解釈する)と呼ばれるファイルで引き続き失敗します。

sort < "$f1"

それらの問題はありません。

ここでは、ファイルを開くのはシェルです。また、ファイルを開けない場合は、さらに役立つ可能性のあるエラーメッセージが表示され(たとえば、ほとんどのシェルではスクリプトの行番号が示されます)、エラーメッセージは次のように表示されます。ファイルを開くために可能な限りリダイレクト。

そして

sort < "$f1" > out

sort -- "$f1" > outとは異なり)、"$f1"を開けない場合、outは作成または切り捨てられず、sortも実行されません。

混乱の可能性を取り除くために(以下のコメントに従います)、コマンドがファイルをmmap() ingしたり、ファイル内でlseek() ingしたりできます(sortはどちらも行いません)。ファイル自体がシーク可能です。唯一の違いは、ファイルがシェルによって以前に開かれ、ファイル記述子0で開かれるのに対し、後で別のファイル記述子でコマンドによって開かれることです。コマンドは、必要に応じてfd 0をシーク/ mmapできます。これをcat file | cmdと混同しないでください。今回はcmdのstdinをmmapしたりシークしたりできないパイプです。

55

問題は、ダッシュで始まるファイル名です。コマンドが値をオプションとして解釈するため、sort "$f1"の値がf1で始まる場合、-は機能しません。これは通常エラーになりますが、 セキュリティホールが発生する になることさえあります。 sort -- "$f1"を使用すると、 二重ダッシュ引数--は「このポイントを超えるオプションがない」ことを意味します なので、f1の値はオプションとして解釈されません。ただし、エッジのケースはまだ1つあります。f1の値がダッシュで、それ以外は何もない場合、それはオプションではなく、引数-です。これは、「標準入力」を意味します(引数は入力ファイルです。出力ファイルの場合、「標準出力」を意味します)。

リダイレクトを使用すると、これらの落とし穴をすべて回避できます。

これは、sortだけでなく、ほとんどのコマンドに適用されます。