回答:
疑わしい場合は、ソースコードを読んでください。=)
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はコマンドを受け取ります
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を呼び出します。内容の最初の単語は最初の引数であり、スクリプトファイル名と誤解される可能性があります。
An argument of - is equivalent to --.
xargs
代わりに使用したい場合は、(十分な小さな入力スクリプトの限られたシナリオで)で動作し| xargs bash -c
ます; しかし、実際には、これはの有用または慣用的な使用法ではありませんxargs
。