Answers:
从 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
那是首先要了解的部分;我想第二种情况很简单,不需要解释。
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
echo
是二进制(或内置命令),并且foo
是第一个参数。
这里:
/bin/sh -c echo foo
/bin/sh
是二进制文件,其第一个参数是-c
,它本身接受“命令字符串”作为参数。这是echo
在上述的例子。然后是第三个参数:foo
这是for的参数/bin/sh
,而不是for 的参数echo
。这就是为什么在您的第三个示例中:
/bin/sh -c 'echo foo; echo bar'
...均已打印。您引用了论点。因此:第一个自变量是-c
,而该自变量的参数被'echo foo; echo bar'
整体解释为一个自变量;作为“命令字符串”。
该结构sh -c word
仅执行单词(在shell中)。
附加词意味着其他含义,例如参数零,一,二等:
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
第一个单词(在options后面)是echo
,即执行的单词。没有文本的回显将仅打印换行符,除此之外:
$ / bin / sh -c echo foo
这就是为什么您会空行的原因。
如果引用空格,您将执行“一个单词”(没有空格),如下所示:
$ / bin / sh -c echo \ foo 富 $ / bin / sh -c“ echo foo” 富 $ / bin / sh -c'echo foo' 富
使用引号将执行的命令保留为一个“单词”。
sh -c 'echo $1' echo foo