次のようにコマンドを呼び出します:
mkdir -- -a
-- その後でオプションが終了することを意味するため、 -a mkdir のオプションとしてではなく、文字どおりに解釈されます .この構文は mkdir だけでなく、 、ただし、echo を除くすべての POSIX 準拠ユーティリティ および test .仕様書より:
引数 -- は、オプションの終わりを示す区切り文字として受け入れられる必要があります。後続の引数は、'-' 文字で始まっていても、オペランドとして扱われるべきです。 -- 引数をオプションまたはオペランドとして使用しないでください。
-- の使用 ファイル名を扱い、それらがコマンドを壊さないようにしたいほとんどすべてのアクションにセーフガードとして推奨されます。ループ内でファイルを移動する場合、次のように呼び出したい場合があります。そのため、-i というファイル オプションとして正しく解析されません:
mv -- "$f" new-"$f"
合理的なプログラムで動作する最も簡単な方法は、- の前に相対パス名を使用することです。 、例えばmkdir ./-a -a というディレクトリを作成します 現在の作業ディレクトリ内。
この「トリック」を使用する最も一般的な例は、ダッシュで始まるファイルを削除する場合です。したがって、rm ./-a を実行できます。 .
mkdir '-a'の理由 、または mkdir \-a これらの方法 (引用符またはバックスラッシュを使用) の両方が シェル を防ぐために使用されているため、機能しません (おそらく bash ) それらに特別な意味を与えることから。 -a以降 とにかく、シェルにとって特別なことを意味するわけではありません。これらは、mkdir に渡される方法には影響しません。 .
mkdirまで シェルから引数のリストを受け取り、それらを引用符で囲んだかどうか、またはバックスラッシュがあったかどうかを判断できません。 1 つの引数 -a が表示されるだけです .そのため、-- が必要です。 他の回答で説明されているように。