「bash-」の「-」はどういう意味ですか?


33

bash -次のbashシェルコードではどういう意味ですか?最後のコードを入力として出力するために使用されるようです。もしそうなら、私はそれをbashまたはと書くことができxargs bashますか?

curl --silent --location https://rpm.nodesource.com/setup | bash -

回答:


36

疑わしい場合は、ソースコードを読んでください。=)

Bash 4.3、shell.cライン830、機能parse_shell_options()

  /* A single `-' signals the end of options.  From the 4.3 BSD sh.
     An option `--' means the same thing; this is the standard
     getopt(3) meaning. */
  if (arg_string[0] == '-' &&
       (arg_string[1] == '\0' ||
         (arg_string[1] == '-' && arg_string[2] == '\0')))
    return (next_arg);

言い換えれば、これ以上のオプション-ないと言っています。コマンドラインに他の単語がある場合、その単語がで始まっていても、それらはファイル名として扱われます-

あなたの例では、もちろん、それに-続くものは何もないので、それは完全に冗長です。つまり、bash -はとまったく同じbashです。


Bashはコマンドを受け取ります

  1. スクリプトファイルがコマンドラインで提供されている場合、または
  2. stdinがTTYではない場合(stdinがパイプの場合など、stdinから非対話形式で、BashはそのURLのコンテンツをスクリプトとして実行します)、または
  3. そのstdinがTTYの場合、対話式に。

bash -Bashにコマンドを標準入力から読み取るように指示するのは誤解です。一方であるあなたの例では、bashのは、標準入力からのコマンドを読み込むというのは本当、それはとてもかかわらずがあったかどうかの行われていた-上記のように、ので、コマンドライン上bash -と同じですbash

-stdinを意味しないことをさらに説明するために、以下を検討してください。

  • このcatコマンドは、a -をstdinとして解釈するように設計されています。例えば:

    $ echo xxx | cat /etc/hosts - /etc/shells
    127.0.0.1 localhost
    xxx
    # /etc/shells: valid login shells
    /bin/sh
    /bin/dash
    /bin/bash
    /bin/rbash
    /bin/zsh
    /usr/bin/zsh
    /usr/bin/screen
    /bin/tcsh
    /usr/bin/tcsh
    /usr/bin/tmux
    /bin/ksh93
    
  • これとは対照的に、あなたはbashが実行するために得ることができない/bin/date、その後/bin/hostname、これを試みることによって:

    $ echo date | bash - hostname
    /bin/hostname: /bin/hostname: cannot execute binary file

    むしろ、それは/bin/hostnameシェルスクリプトファイルとして解釈しようとしますが、これはバイナリのgobbledygookの束であるため失敗します。

  • どちらdate +%sを使用してbash -も実行できません。

    $ date +%s
    1448696965
    $ echo date | bash -
    Sat Nov 28 07:49:31 UTC 2015
    $ echo date | bash - +%s
    bash: +%s: No such file or directory

xargs bash代わりに書くことができますか?いいえ curl | xargs bash。スクリプトの内容をコマンドライン引数としてbashを呼び出します。内容の最初の単語は最初の引数であり、スクリプトファイル名と誤解される可能性があります。


6
唯一の正しい答えに賛成票を投じてください。
ガイラ

確かに:マンページの言葉でAn argument of - is equivalent to --.
steeldriver

本当にxargs代わりに使用したい場合は、(十分な小さな入力スクリプトの限られたシナリオで)で動作し| xargs bash -cます; しかし、実際には、これはの有用または慣用的な使用法ではありませんxargs
トリプリー

@tripleee URLの内容が1ライナー以上の場合、改行やその他の区切り文字はすべて間違っている可能性があります。
200_success

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