echoが/bin/sh -c echo fooと呼ばれ、何も出力しないのはなぜですか?

echoが/bin/sh -c echo fooと呼ばれ、何も出力しないのはなぜですか?

たとえば、これが機能している間:

$エコフー
金持ち

以下は行われません。

$/bin/sh -c エコ foo

そしてこれは本当です:

$/bin/sh -c 'エコ foo;エコバー'
金持ち
バー

説明がありますか?

答え1

~から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

$ echo foo
foo

これはecho引数とともに呼び出されます。金持ちそして金持ち印刷されます。

$ /bin/sh -c echo foo

これは引数を使用してシェルを呼び出し、echo次を提供します。金持ち引数として $0。新しい行を出力echoして削除します。金持ち。出力したい場合金持ち、主張を引用します。

sh -c 'echo foo'

または提供されたパラメータを使用してください。

sh -c 'echo $0' foo

この例では

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

echo foo; echo bar出力パラメータを使用したシェル呼び出し

foo
bar

答え3

このコマンドでは:

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'全体が「コマンド文字列」として解釈されます。

答え4

この設定はsh -c word(シェルで)単語のみを実行します。
追加された単語は、パラメータ0、1、2などの他の意味を表します。

sh -c word zero one two three

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

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 foo、最初の単語(オプションの後ろ)はであり、echoこれが実行されます。テキストのないエコーは改行だけを印刷し、他は印刷しません。

$/bin/sh -c エコ foo

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

スペースを引用すると、次のように「1単語」(スペースなし)を実行します。

$ /bin/sh -c エコ\ foo
金持ち
$ /bin/sh -c "エコ foo"
金持ち
$/bin/sh -c 'エコ foo'
金持ち

結論として

実行されたコマンドを「単語」に保つには、引用符を使用してください。

関連情報