echoが/ bin / sh -c echo fooとして出力されないのはなぜですか?


15

たとえば、これは機能しますが:

$ echo foo
foo

これはしません:

$ / bin / sh -c echo foo

これに対して:

$ / bin / sh -c 'echo foo; エコーバー」
foo
バー

説明はありますか?

回答:


21

から man sh

-c string   If the -c option is present, then commands are read from string. 
            If there are arguments after the string, they are assigned to the
            positional parameters, starting with $0

つまり、コマンドは次のようになります。

 $ sh -c 'echo "$0"' foo 
 foo

同様に:

$ sh -c 'echo "$0 $1"' foo bar
foo bar

それが理解する最初の部分でした。2番目のケースは単純で、説明を必要としません。


2
より厳密な標準準拠の方法は次のようになりますsh -c 'echo $1' echo foo
jlliagre

1
sh -c 'echo "$@"' fnord a b c d ...
zwol

3
私見説明はかなり良かったが、sh -c 'echo $0' foo最良の選択肢ではありませんが、質問者が既に知っていることを考慮に入れて/bin/sh -c 'echo foo; echo bar'作品を、あなたは、単にコマンドを引用答えることができる/bin/sh -c 'echo foo'
X3MBoy

1
@ X3MBoy質問者は、/ bin / sh -c 'echo foo'が正常に機能することをすでに知っています。彼は私が説明し、エコー何かの外に望んでいた
Ijazアフマド・ハーンを

18
$ echo foo
foo

これはecho引数fooで呼び出し、fooが出力されます。

$ /bin/sh -c echo foo

これは引数でシェルを呼び出し、引数としてfooecho提供します 。改行を出力し、あなたは捨てるFOOをfooを出力する場合は、引数を引用符で囲みます。$0echo

sh -c 'echo foo'

または、提供された引数を使用します。

sh -c 'echo $0' foo

この例では

$ /bin/sh -c 'echo foo; echo bar'
foo
bar

シェルは、echo foo; echo bar出力する引数で呼び出されます

foo
bar

8

このコマンドでは:

echo foo

echoはバイナリ(または組み込みコマンド)でfooあり、最初の引数です。

ここに:

/bin/sh -c echo foo

/bin/shは、最初の引数が-cであるバイナリで、それ自体がパラメータとして「コマンド文字列」を受け入れます。これはecho上記の例です。次に、3番目の引数があります。fooこれは、/bin/shではなくの引数ですecho。3番目の例でそういうわけです:

/bin/sh -c 'echo foo; echo bar'

...両方が印刷されます。引数を引用しました。したがって、最初の引数は-cであり、この引数のパラメーター'echo foo; echo bar'は全体が1つの引数として解釈されます。「コマンド文字列」として。


3

構造体sh -c wordはワードのみを実行します(シェル内)。
追加された単語は、引数0、1、2など、他のことを意味します。

sh -c word zero one two three

1つの単語としてスペースを含むコマンドを保持するには、引用符が必要です。

sh -c 'echo fnord' zero one two three

したがって、これはすべての引数を出力します:

$ sh -c 'echo "args=" "$0" "$@"' zero one two three
args = zero one two three

提示する例で/bin/sh -c echo fooecho、最初の単語(オプションの後)はであり、これが実行されます。また、テキストのないエコーは改行のみを出力し、それ以外は何も出力しません。

$ / bin / sh -c echo foo

そのため、空の行が表示されます。

スペースを引用すると、次のように「1ワード」(スペースなし)が実行されます。

$ / bin / sh -c echo \ foo
foo
$ / bin / sh -c "echo foo"
foo
$ / bin / sh -c 'echo foo'
foo

結論

引用を使用して、実行されたコマンドを1つの「単語」として保持します。

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