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


15

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

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

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

これで多くのコマンドを見てきましたが、論理的な説明を見つけることができず、Google検索を再定式化する方法も見つかりませんでした。パイプされたコマンドの出力ですか?



2
ネットワークからものをダウンロードして、それを直接配管するのsudo bashは本当に怖いです。そのような実践を奨励しないチュートリアルを探してみてください。
hmakholmは

そのNPMチュートリアルが、私は...あなたに同意しない
オマールBISTAMI

1
記号が含まれているものを検索する必要がある場合は、を試してくださいsymbolhound.com
ジョー

回答:


31

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 -

私は疑う、このコマンドの作者が実現しないかもしれない-と同等である--。この場合には 私は疑う著者が確認したかったbash、標準入力から読み込みます、彼らは期待-ガイドライン13に係る作業に。

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

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

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

どのように確認するに--及び-、一般的に有用であることができ、以下の例を検討します。


cat私のKubuntuの中で両方のガイドラインに従うと、私はの有用性を実証するためにそれを使用します---

fooexist という名前のファイルを作成します。これにより、ファイルが印刷されます。

cat foo

--helpexist という名前のファイルを作成します。これはファイルを印刷しません:

cat --help

しかし、これは次の名前のファイルを印刷します--help

cat -- --help

これにより、名前が付けられたファイル--helpが標準入力からのものを連結します。

cat -- --help -

確かにファイルとして解釈されるものを--常に渡すことができるので、本当に必要ないようです./--help。しかし、考慮してください

cat "$file"

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

cat -- "$file"

6

man bash単一文字のオプションの最後にあります: -

--    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で使用する理由はわかりませんが、害はありません。


ご回答ありがとうございます。はい、完全なコマンドを引用しました。-または-の後のものはオプションとしてではなく、ファイル名または引数として見られますが、それが有用な例を挙げていただけますか?
オマービスタミ

1
名前が始まるスクリプトを許可することは、実際に-はありそうもない要件ですが、-/ --は可能にします。
AFH

1
@OmarBISTAMIコマンドを引用すると、シェルがコマンドを展開する方法に影響しますが、それに続く引数には影響しません。正当な引数を引用符で囲むと、それらはコマンド名の一部になりますが、これもあなたが望むものではありません。引数としてファイル名を使用するコマンドがいくつかありますが、デフォルトでは標準入力を使用しません。考案された例では、2つのファイルの間に(端末またはパイプからの)入力を挟むことができます。cat file1 - file2 > file3
ジョー

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

bash -それbashは標準入力を待っていることを意味します。したがって、bashは実際には、左側にあるコマンドによって返されたものをすべて実行します。|

同様の簡単な例は次のとおりです。

echo hello | cat - ここでcatは、「hello」と出力されます。どうして?「こんにちは」を介して猫に送られているため、|そしてcat、それに送られたものを待っています

それでは、コマンド全体を2つに分けましょう。

curl -sL https://rpm.nodesource.com/setup_6.x

このcurlコマンドは、bashが理解して実行できるものを返します

次に|、curlコマンドによって返された出力をパイプの右側に送信するパイプがありますsudo -E bash -。最後にsudo -E bash -、bashは送信されたものを実行する準備ができました

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.