から https://unix.stackexchange.com/a/458074/674
コマンドに任意の引数を渡すときは
--
を使用することを忘れないでください(または可能な場合はリダイレクトを使用します)。したがって、sort -- "$f1"
ではなくsort < "$f1"
以上のsort "$f1"
を使用してください。
--
とリダイレクトを使用することが望ましいのはなぜですか?
sort < "$f1"
がsort -- "$f1"
よりも優先される理由
sort -- "$f1"
がsort "$f1"
よりも優先される理由
ありがとう。
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したりシークしたりできないパイプです。
問題は、ダッシュで始まるファイル名です。コマンドが値をオプションとして解釈するため、sort "$f1"
の値がf1
で始まる場合、-
は機能しません。これは通常エラーになりますが、 セキュリティホールが発生する になることさえあります。 sort -- "$f1"
を使用すると、 二重ダッシュ引数--
は「このポイントを超えるオプションがない」ことを意味します なので、f1
の値はオプションとして解釈されません。ただし、エッジのケースはまだ1つあります。f1
の値がダッシュで、それ以外は何もない場合、それはオプションではなく、引数-
です。これは、「標準入力」を意味します(引数は入力ファイルです。出力ファイルの場合、「標準出力」を意味します)。
リダイレクトを使用すると、これらの落とし穴をすべて回避できます。
これは、sort
だけでなく、ほとんどのコマンドに適用されます。