「--」(二重ダッシュ)パラメータはどこに記録されていますか?

「--」(二重ダッシュ)パラメータはどこに記録されていますか?

--ファイル名がダッシュで始まるときに必要な「オプションの終わり」信号として(デュアルダッシュ)を許可するいくつかのユーティリティがあります。

$ echo "Hello World!" >-file

$ cat -- -file
Hello World!

$ cat -file                      # cat - -file fails in the same way.
cat: invalid option -- 'f'
Try 'cat --help' for more information.

ただし、これらのユーティリティの一部は、マニュアルページにそのようなオプションを表示しません。

これmanページはcat--すべてのオペレーティングシステムでパラメータの使用(または有効性)は文書化されていません。これが激しいUnix-Linux戦争を意味するわけではありません、これは妥当で有用な関心事だと思います。

cat、、(そして他の多くの人も)私が見つけることができるマニュアルページにそのようなオプションを文書化していないと確信していますmved

これは./-fileより移植性の高い解決策です--。たとえば、source(ドット)コマンド(で書かれている.)は(通常)引数をうまく処理しません--

$ echo 'echo "Hello World!"' >-file

$ . ./-file
Hello World!

$ . -file
ksh: .: -f: unknown option
ksh: .: -i: unknown option
ksh: .: -l: unknown option
ksh: .: -e: unknown option
Usage: . [ options ] name [arg ...]

$ . -- -file         # works in bash. Not in dash, ksh, zsh.
ksh: .: -file: cannot open [No such file or directory]

答え1

これは、すべてのユーティリティのPOSIX要件です。POSIX 12.02章、詳細についてはガイド10を参照してください。

最初-オプション引数ではない引数は、オプションの終わりを表す区切り文字として受け入れる必要があります。後続の引数は、'-'文字で始まってもオペランドとして処理する必要があります。

POSIXは、すべてのユーティリティがこれらのガイドラインに従うことをお勧めします。

いくつかの例外があります。いいねecho(読み込みオプション)。そして指示に従わない特別な組み込み関数(例えばbreakdotなどexec:

いくつかの特別な組み込み関数は、XBDユーティリティの構文ガイドラインに準拠していると説明されています。それ以外の場合、ユーティリティ記述の基本要件は、破棄する最初の引数として「--」を識別することは適用されず、準拠アプリケーションはその引数を使用しないでください。

目的は、POSIXのマニュアルページの指示に従わないすべてのコマンドを文書化することです。POSIX 12.02章3番目の段落:

一部の標準ユーティリティは、これらのガイドラインをすべて満たしていません。そのような場合、偏差はオプションセクションで説明されています。

〜のようにPOSIX のcatマニュアルページ記録のOPTIONSセクションには偏見はなく、--有効な主張として受け入れられると予想されます。

指示に従わない(バグのある)実装がまだあるかもしれません。

特に、ほとんどのGNUコアユーティリティはこのガイドに従います。

答え2

GNUユーザー領域を持つLinuxオペレーティングシステム:Debian、RedHat、Ubuntu、Mintなど(一部のBSDではない)の場合、GNU一般慣行が非常に重要です。

あなたの質問のユーティリティリストの共通点はすべてGNUであり、実際にはすべてGNU coreutilsであることです。これGNU coreutilsの全リストもっと長く。

ほとんどのGNUユーティリティは、共通のユーザーインターフェイスと、使用される信号などの基本的なコマンドラインオプションの共通セットを--help共有--versionします--オプション終了

項目は次の場所にありますinfo commonGNUウェブページ含む:

これらのプログラムはすべて特定のオプションを使用できます。すべてのプログラムについて同じ説明を作成するのではなく、ここでは各プログラムについて説明します。 (実際、すべてのGNUプログラムはこれらのオプションを受け入れます(または許可する必要があります)。

'--' は
オプションのリストを区切ります。後続の引数(存在する場合)は、「-」で始まってもオペランドとして扱われます。たとえば、 "sort -- -r" は -r というファイルから読み込みます。

このアイテムにアクセスするための--より正確な(しかし解釈して覚えやすい)コマンドは(正確にコピーしてください)ですinfo -- cat --

答え3

にも記録されています。getopt(1)そしてgetopt(3)

例えば、

「--」引数の後に続く各引数は、常にオプションではなく引数として解釈されます。

答え4

--オプションの終わりを示し、使用中のシェルの一部として追加のオプション処理を無効にします。

また、man catシェルのマニュアルで説明されているように、スペースがコマンドオプション間の区切り文字であることも説明しません。

どのシェルを使用しますか?/bin/bash?したがって、あなたの質問に対する答えはですman bash。これはシェル機能の一部として解釈されるため、コマンド機能の一部ではありません。


更新:これは正しくありません。

訂正していただきありがとうございます。私が言及した内容は、ほとんどの組み込みシェルコマンドに適用されます(マニュアルで特に断りのない限り)。ただし、外部コマンドでは POSIX ルールが必要です。

関連情報