⚠️重要

⚠️重要

私はそれがコマンドで使用されているのを見ました--compgen

たとえば、

compgen -W "foo bar baz" -- b

--私の中にあるのはどういう意味ですか?

答え1

--より正確には、ほとんどのBashではデュアルダッシュ()が使用されます。組み込みコマンドと他のいくつかのコマンドを使用してコマンドオプションの終わりを通知し、その後は位置引数のみを受け入れます。

使用例:ファイル内の文字列を探したいとしましょう-v。このオプションは通常、-v一致の意味を反転すると見なされますが(一致しない行のみを表示)、--次のように文字列をgrepできます。-v

grep -- -v file

答え2

man bash私たちは読むことができますシェル組み込みコマンド部分(オンライン文書):

特に明記しない限り、このセクションで説明されている各組み込みコマンドはacceptオプションで-始まります。-- オプションの終わりを示します。

:、、組み込み関数はオプションを受け入れず、true特に扱われません。、、、、および組み込み関数は、必要なく開始する引数を受け入れて処理します。引数を受け入れるが許可オプションとして指定されていない他の組み込み関数は、無効なオプションで始まる引数を解釈するため、これらの解釈を回避する必要があります。falsetest--exitlogoutbreakcontinueletshift------

これがオプションが終了したという意味ではechoありません。--

答え3

これはパラメータ(オプション)リストの終わりを示します。

答え4

使用されたコマンドではPOSIXgetopt()オプションや他の多くのオプションを解析するAPIは、--オプションの終わりを示します。

存在する:

rm -f -- -f

1つ目-fはオプションとして扱われrm、2つ目は削除するファイル名として扱われます。それ以降のすべての項目は--オプションと見なされないためです。

POSIX 準拠のユーティリティとgetopt()実装では、オプションではなく引数の後にオプションは使用できません。たとえば、次のようになります。

grep pattern -f

patternというファイルで一致する行を見つける必要があります-f

getopt()ただし、ほとんどのGNUユーティリティ(GNUを含む)とその拡張(しかし組み込み関数でもGNUシェルでもない)で使用されるGNU実装は、環境に変数がない限り、デフォルトではこれを行いません。getopt_long()grepbashbashPOSIXLY_CORRECT

したがって、これには--オプションではなく主要な引数も必要です。

grep -- pattern -f

オプションの終わりを表示する古い方法はを使用することです-。 kshまたはzshのほとんどの実装とほとんどの組み込み機能は、shまだ閉じるタグをオプションとしてサポートしていることがわかります。-しかし、最近ではこれはあまり一般的ではありません。

--一部のコマンドは、後続のオプションの表示をサポートしていないことが知られています。ほとんどのecho実装はこのカテゴリに属します。それは任意のデータを出力するために使用できない理由の1つ

⚠️重要

--オプションではない引数が次から始まる場合-(または一部のコマンドの場合)+が必要ですが、-また、オプション以外のパラメータが/で始まらないことを保証できない場合+。含む:

  • rm -f -- "$file"
  • rm -f -- "${files[@]}"
  • rm -f -- *.txt
  • rm -f -- $(command-that-generates-a-list-of-files-or-file-patterns)
  • cmd | xargs rm -f --

コマンドが--オプションマーカーで終わることをサポートしていることを保証できない場合は、そのファイル名引数に代わるものは、ファイル名の前にプレフィックスを付けることです./

somegrep pattern ./*.txt

これを追加しないと、--任意のコマンド注入の脆弱性が発生する可能性があります。、特にあなたも拡張子を引用するのを忘れました。。たとえば、

sed -e 's/foo/bar/' *.txt

現在の作業ディレクトリにrebootというファイルがある場合は実行されます。または'-es/.*/reboot/e;#.txt'に変更して修正しました。sed -e 's/foo/bar/' -- *.txtsed -e 's/foo/bar/' ./*.txt

以下にも適用されます。

rename 's/foo/bar/' *foo*

いくつかのバリエーションがありますrename。一部(脆弱ではない)バリアントrenameはサポートされていません--

print $var

zsh(引用符で囲まれていない引数拡張はこのシェルで比較的安全ですが)、含まれている場合は再起動が$var実行されます-va[1$(reboot)]。修正またはprint -- $varバックスラッシュ処理を無効にするprint - $varこともできますprint -r -- $var

関連情報