コマンドを実行しfile -- *
、次の出力を取得します。
-file04: data
-file05: data
-file06: data
-file07: ASCII text
したがって、デフォルトではファイル名とコンテンツタイプを印刷します。しかし、パラメータとはどういう意味ですか?
ベストアンサー1
file -- *
以下はUnixシェル言語のコードです。新しいプロセスでコマンドを見つけて実行し、引数と環境変数を渡し、標準の入力/出力/エラーストリームを調べるように設計されたUnixシェル言語です。
言語は初歩的ですが、いくつかの素晴らしい機能があります。
例のこの行簡単なコマンドシェル言語構文から。
スペースは単語を区切るために使用されます。ここでfile
、--
そして*
。
ここで、最初の単語file
は実行するコマンドの名前として扱われます。シェルは特殊変数を使用してコマンドへのパスを見つけます$PATH
。私はそうかもしれません/usr/bin/file
。
この*
単語にはシェルワイルドカード文字(*
)が含まれているため、次のようなシェルの特殊機能をトリガーします。ファイル名の生成またはワイルドカード(POSIXではこれを呼び出します。パス名拡張)。シェルは*
パターンに一致するファイル名のリストに置き換えられます。*
任意の数の文字に一致するパターン。したがって、シェルはアルファベット順にソートされた現在のディレクトリのすべてのファイル名(隠しファイルを除く)に拡張します。
その後、シェルは子プロセスを分岐し、その子プロセスで、および/usr/bin/file
ファイルfile
名--
のリスト(あなたの場合-file04
、-file05
...)を引数として使用して実行します。
これfile
は別のコマンドですsh
。sh
の使命はコマンドラインを解析することであり、そのfile
使命はファイルの内容の性質を識別することです。
ほとんどのコマンドと同様に、一度起動すると、その引数がfile
解析されます。最初は、どのようにfile
呼び出すのか、エラーメッセージのように自分自身を参照する方法を教えてくれます。次のパラメータは、何をすべきかを示します。
ほとんどのコマンドと同様に、次から始まる引数は-
オプションと見なされます。ここで最初のパラメータはです--
。技術的にはオプションではなく、オプションを閉じるタグです。file
これからオプションの処理を中止する必要があり、次の引数がで始まってもオプションとして処理してはならないことを知らせます-
。
-file01
次のパラメータは、実際にはオプションとして扱われるのではなく、コンテンツの性質を示すfile
ファイル名なので、これは良いことです。
(一部のコマンドで問題になる可能性があります)で始まるオプションではなく、引数を渡すとき、または--
/で始まる可能性のある引数が一部の拡張の結果である場合(たとえば、、、... hourを使用)、これを行う必要があります。します。-
+
-
+
cmd -- "$arg"
cmd -- *
cmd -- "${args[@]}"
cmd -- $(cmd2)
そうしないと、バグやセキュリティの脆弱性が発生する可能性があります。
ファイルパスを意味するパラメータの場合、別のアプローチは/
(で始まらないパラメータの接頭辞を付けることです。これは同じファイルへのパスですが、後者のみオプションとして使用できます。終了マーカーはオプションでサポートされていないコマンドに必要な場合があり、処理後も呼び出しファイルではなく標準入力のみを意味すると解釈されるか、含まれるパラメータが渡されるなどの他の問題を解決することもできます。./
./-foo/bar
-foo/bar
--
-
-
--
awk
=