- になると、bash はやや非標準的な方法で動作します。 .
POSIX によると:
<ブロック引用>
ガイドライン 10:
最初の -- オプション引数ではない引数は、オプションの終わりを示す区切り文字として受け入れられる必要があります。 - で始まっている場合でも、後続の引数はすべてオペランドとして扱う必要があります。
[…]
ガイドライン 13:
オペランドを使用して読み取りまたは書き込み用に開くファイルを表すユーティリティの場合、- オペランドは、標準入力 (または、出力ファイルが指定されていることがコンテキストから明らかな場合は標準出力) または - という名前のファイルのみを意味するために使用する必要があります。 .
そして
<ブロック引用>
これらのガイドラインに準拠していると POSIX.1-2017 の Shell and Utilities ボリュームで説明されているユーティリティは、オペランド - を受け入れるか、受け入れないかを要求されます。 標準入力または標準出力を意味します。この使用法はオペランドのセクションで説明されています。それ以外の場合、そのようなユーティリティがオペランドを使用してファイルを表す場合、オペランドが - であるかどうかは実装定義です。 標準入力 (または標準出力)、または - という名前のファイルを表します .
しかし、その後 man 1 bash 読み取り:
-- オプションの終了を通知し、以降のオプション処理を無効にします。 -- の後の引数 ファイル名および引数として扱われます。 - の引数 -- と同等です .
Bash - の場合 は標準入力でもファイルでもないため、標準的ではありません。
今、あなたの特定のケース:
curl -sL https://rpm.nodesource.com/setup_6.x | sudo -E bash -
私は疑う このコマンドの作成者は - を理解していない可能性があります -- に相当します この場合。私は疑う 作成者は bash を確認したかった 標準入力から読み取ります。- が必要です。 ガイドライン13に従って働くこと。
でもガイドライン通りに動いたとしても - bash であるため、ここでは不要です。 標準入力がパイプであることを検出し、それに応じて動作します (-c を除く) が与えられるなど)。
まだ - ガイドラインに従って動作しません。-- のように動作します .まだ -- その後に引数がないため、ここでは不要です。
私の意見では、最後の - 何も変わりません。このコマンドはそれがなくても機能します。
-- の方法を確認するには と -
cat 私のKubuntuでは両方のガイドラインに従っており、それを使用して - の有用性を実証します と -- .
foo という名前のファイルを 存在。これにより、ファイルが印刷されます:
cat foo
--help という名前のファイルを 存在。これはファイルを印刷しません:
cat --help
しかし、これは --help という名前のファイルを出力します :
cat -- --help
これにより、--help という名前のファイルが連結されます 標準入力から来るものは何でも:
cat -- --help -
-- は本当に必要ないようです 、いつでも ./--help を渡すことができるため これは確かにファイルとして解釈されます。ただし、考慮してください
cat "$file"
変数の内容が事前にわからない場合。 ./ を先頭に追加することはできません 絶対パスと ./ の可能性があるためです。 それを壊します。一方、かもしれません --help という名前のファイル (なぜですか?)。この場合 -- とても便利です。これはより堅牢なコマンドです:
cat -- "$file"
man bash で 、1 文字のオプションの最後に:-
-- A -- signals the end of options and disables further option processing.
Any arguments after the -- are treated as filenames and arguments. An
argument of - is equivalent to --.
コマンド全体を引用した場合、- を使用する理由がわかりません。 bashの後 この場合、害はありません。