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