c - "sh -c cmd"和 "cmd"之间的区别?

标签 c shell exec

“sh -c cmd”和“cmd”分别从 shell commnad 行执行时和从 c exec() 函数执行时有什么区别?谢谢。

最佳答案

这取决于'cmd'代表什么。在基本情况下,它是一个简单的命令名称(例如 psls),那么在 shell 命令行中没有区别,并且在执行时几乎没有区别execvp()。 'non-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 的值不包含任何引号 — 所以我的意思是我所说的,尽管它可能没有那么明显。)

关于c - "sh -c cmd"和 "cmd"之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19043858/

相关文章:

c - 缩进很奇怪——修复或选择一个替代方案

go - 在 Golang 中将字符串通过管道传输到命令的 STDIN

c - 执行不工作

linux - 按列排序 Unix

shell - 如何在Unix中应用具有相同输入和输出文件的sort和uniq?

c - 将 execvpe 的输出传递到 C 中的字符串中

在 fork() 和 exec() 之后创建管道

c - 在 C 中读取和写入文件时遇到问题

c - 冒泡排序 C 编程

c - 有没有办法用 C ping 一个特定的 IP 地址?