web-dev-qa-db-ja.com

最後の " - "(ハイフン)は `bash`のオプションにはどういう意味ですか?

このチュートリアルでは、次のコマンドを実行する必要があります。

# curl -sL https://rpm.nodesource.com/setup_6.x | Sudo -E bash -

bashの後の最後の-(ハイフン)はどういう意味ですか?

私はこれでたくさんのコマンドを見ました、そして、私自身が論理的な説明を見つけることができなかったそしてそれのためにグーグル検索を作り直す方法を見つけることもできませんでした。それはパイプされたコマンドの出力ですか?

15
Omar BISTAMI

-に関して言えば、Bashはやや非標準的なふるまいをします。

POSIX はこう言います:

ガイドライン10:
オプション引数ではない最初の--引数は、オプションの終わりを示す区切り文字として受け入れる必要があります。後続の引数は、たとえ-文字で始まっていても、オペランドとして扱う必要があります。

[…]

ガイドライン13:
読み書き用に開くファイルを表すためにオペランドを使用するユーティリティでは、標準入力(または出力ファイルが指定されていることがコンテキストから明らかな場合は標準出力)のみを意味する-オペランドを使用する必要があります。 )または-という名前のファイル。

そして

これらのガイドラインに準拠しているというPOSIX.1-2017のShell and Utilities巻に記載されているユーティリティが、標準入力または標準出力を意味するオペランド-を受け入れる、または受け入れないために必要な場合、この使用法はOPERANDSセクションで説明されます。そうではなく、そのようなユーティリティーがファイルを表すためにオペランドを使用する場合、オペランド-が標準入力(または標準出力)を表すか、それとも-という名前のファイルを表すかは、実装定義です。

しかし、 man 1 bash は次のようになります。

--はオプションの終わりを示し、それ以降のオプション処理を無効にします。 --の後の引数はすべてファイル名および引数として扱われます。引数-は、--と同等です。

そのため、Bashでは-は標準入力もファイルも意味しませんので、やや非標準です。

今あなたの特定のケース:

curl -sL https://rpm.nodesource.com/setup_6.x | Sudo -E bash -

Isuspectこのコマンドの作成者は、この場合---と同等であることを認識していない可能性があります。 Isuspectbashが標準入力から確実に読み取れるようにしたかったので、ガイドライン13に従って-が機能することを期待しました。

しかし、ガイドラインに従って動作していても、bashは標準入力がパイプであることを検出し、それに応じて動作するため(-が指定されていない限り)、ここでは-cは不要です。

それでも-はガイドラインに従って動作しません、それは--のように動作します。それ以降の引数がないため、--はここでは不要です。

私の意見では、最後の-は何も変わりません。コマンドはそれなしで動作します。

---が一般的にどのように役立つかを確認するには、以下の例を調べてください。


私のKubuntuのcatは両方のガイドラインに従っており、私はそれを使って---の有用性を実証します。

fooという名前のファイルが存在するようにします。これでファイルが印刷されます。

cat foo

--helpという名前のファイルが存在するようにします。これはファイルを印刷しません。

cat --help

しかし、これは--helpという名前のファイルを出力します。

cat -- --help

これは--helpという名前のファイルを標準入力から来るものと連結します。

cat -- --help -

あなたは本当に--を必要としないようです、なぜならあなたはいつでも./--helpを渡すことができるからです。これは確かにファイルとして解釈されます。しかし、検討してください

cat "$file"

変数の内容が事前にわからない場合絶対パスである可能性があり、./が壊れる可能性があるため、単に./を先頭に追加することはできません。一方、may--helpという名前のファイルかもしれません(なぜならそうではないのですか?)この場合--は非常に便利です。これはもっと堅牢なコマンドです。

cat -- "$file"
31

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の後に-を使用する理由はありませんが、害はありません。

6
AFH