为什么不以/ bin / sh -c的名字呼应-e echo foo输出任何内容?


15

例如,虽然可行:

$ echo foo
富

这不是:

$ / bin / sh -c echo foo

这样做:

$ / bin / sh -c'echo foo; 回声栏
富
酒吧

有解释吗?

Answers:


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
更严格,符合标准的方式应该是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 Ahmad Khan

18
$ echo foo
foo

这将echo使用参数foofoo进行调用。

$ /bin/sh -c echo foo

这将使用参数调用外壳程序,echo并提供foo作为参数 $0。在echo输出新行,你放弃FOO。如果要输出foo,请引用参数:

sh -c 'echo foo'

或使用提供的参数:

sh -c 'echo $0' foo

在这个例子中

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

echo foo; echo bar输出以下参数的shell进行调用

foo
bar

8

在此命令中:

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'整体解释为一个自变量;作为“命令字符串”。


3

该结构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'
富

结论

使用引号将执行的命令保留为一个“单词”。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.