~からhttps://unix.stackexchange.com/a/458074/674
使用することを覚えておいてください
--
コマンドに任意のパラメータを渡すとき(または可能であればリダイレクトを使用してください)。だからsort -- "$f1"
またはそのsort < "$f1"
代わりに良いですsort "$f1"
。
最初に使用し--
てリダイレクトするのはなぜですか?
なぜsort < "$f1"
優先順位を置くのですsort -- "$f1"
か?
なぜ sort -- "$f1"
優先順位を置くのですsort "$f1"
か?
ありがとうございます。
答え1
sort "$f1"
$f1
次から始まる値-
または次sort
から始まる値は失敗します(たとえば、+
呼び出されるファイルに重大な結果が生じる可能性があります)。-o/etc/passwd
sort -- "$f1"
(--
オプションの終わりを意味します)はほとんどの問題を解決しますが、呼び出されるファイル-
(sort
標準入力として解釈されます)ではまだ失敗します。
sort < "$f1"
そのような問題はありません。
ここではファイルを開くシェルです。これは、ファイルを開くことができない場合に役立つ可能性があるエラーメッセージも表示することを意味します(たとえば、ほとんどのシェルはスクリプトの行番号を表示します)。可能であれば、リダイレクトを使用してファイルを開くと。
そして
sort < "$f1" > out
(sort -- "$f1" > out
逆)"$f1"
開くことができない場合は、out
作成/切り捨ても実行もできませんsort
。
発生する可能性のある混乱を取り除くために(以下を参照)、ファイル自体が検索可能であれば、コマンドをmmap()
ファイルに入れたりlseek()
ファイル内に入れたりすることを防ぎません。sort
唯一の違いは、ファイルが後で別のファイル記述子に存在する可能性のあるコマンドによって開かれるのではなく、ファイル記述子0のシェルによってより早く開くことです。このコマンドは、必要に応じてfd 0を検索またはマッピングできます。cat file | cmd
今回cmd
はstdinがマッピング/照会できないパイプであるという事実とこれを混同しないでください。
答え2
問題は、ファイル名がダッシュで始まるということです。値が次から始まる場合、sort "$f1"
コマンドはその値をオプションとして解釈するため、何の効果もありません。通常、エラーが発生しますが、可能です。f1
-
セキュリティの脆弱性を作成する。そしてsort -- "$f1"
、二重ダッシュ引数は、--
「他の選択肢はありません」を意味します。したがって、その値はf1
オプションとして解釈されません。しかし、まだ極端なケースがあります。値がf1
ダッシュで他に何もない場合は、オプションではなく-
「標準入力」を意味するパラメータです(パラメータは入力ファイルであるため、出力ファイルの場合はこれを意味します)。 「標準入力」出力」)。
リダイレクトを使用すると、これらすべてのトラップを回避できます。
これはsort
。