たとえば、これは機能しますが:
$ echo foo foo
これはしません:
$ / bin / sh -c echo foo
これに対して:
$ / bin / sh -c 'echo foo; エコーバー」 foo バー
説明はありますか?
たとえば、これは機能しますが:
$ echo foo foo
これはしません:
$ / bin / sh -c echo foo
これに対して:
$ / bin / sh -c 'echo foo; エコーバー」 foo バー
説明はありますか?
回答:
から 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番目のケースは単純で、説明を必要としません。
sh -c 'echo "$@"' fnord a b c d ...
sh -c 'echo $0' foo
最良の選択肢ではありませんが、質問者が既に知っていることを考慮に入れて/bin/sh -c 'echo foo; echo bar'
作品を、あなたは、単にコマンドを引用答えることができる/bin/sh -c 'echo foo'
$ echo foo
foo
これはecho
引数fooで呼び出し、fooが出力されます。
$ /bin/sh -c echo foo
これは引数でシェルを呼び出し、引数としてfooをecho
提供します
。改行を出力し、あなたは捨てるFOOを。fooを出力する場合は、引数を引用符で囲みます。$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
このコマンドでは:
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つの引数として解釈されます。「コマンド文字列」として。
構造体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 foo
はecho
、最初の単語(オプションの後)はであり、これが実行されます。また、テキストのないエコーは改行のみを出力し、それ以外は何も出力しません。
$ / 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つの「単語」として保持します。
sh -c 'echo $1' echo foo