分别从 shell 命令行执行和从 ac exec() 函数执行时,“sh -c cmd”和“cmd”有什么区别?谢谢。
问问题
880 次
2 回答
3
这取决于' cmd
'代表什么。在它是一个简单的命令名(比如ps
or ls
)的基本情况下,在 shell 命令行上没有区别,而在由execvp()
. “非 p”exec*()
函数的语义确实略有不同。他们不使用 PATH 变量,因此该命令必须存在并且可以在当前目录中执行,否则它将失败。
但是,如果cmd
更复杂,那么它可以产生很大的不同。例如:
$ echo $$
17429
$ sh -c 'echo $$'
76322
$ sh -c "echo $$"
17429
$
第一个报告原始shell的进程ID;第二个报告shell运行的进程ID为sh
;第三种是报告原始 shell 的进程 ID 的昂贵方式。请注意,单引号与双引号也很重要。在这里,引号不会出现在 C 调用中(shell 会从参数周围删除引号),并且 的值$$
将是子 shell 的值:
char *argv[] = { "sh", "-c", "echo $$", 0 };
execvp(argv[0], argv);
(我说 C 调用中不存在引号;在 C 代码中的字符串周围需要它们,但传递给的值sh
不包含任何引号 - 所以我的意思是我所说的,尽管它可能不是所有这些都非常明显。)
于 2013-09-27T06:28:56.900 回答
0
从手册页:
-c 字符串 如果存在 -c 选项,则从字符串中读取命令。如果字符串后面有参数,则将它们分配给位置参数,从 $0 开始。
只会cmd
通过 bash(或任何您的默认值)shell 运行。您需要 sh 显式调用 -c 参数。
exec 在这里不应该有所作为。
于 2013-09-27T06:17:08.513 回答