たとえば、これが機能している間:
$エコフー 金持ち
以下は行われません。
$/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' 金持ち
結論として
実行されたコマンドを「単語」に保つには、引用符を使用してください。