【问题标题】:difference between "sh -c cmd" and just "cmd"?“sh -c cmd”和“cmd”之间的区别?
【发布时间】:2013-09-27 06:13:49
【问题描述】:

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

【问题讨论】:

    标签: c shell exec


    【解决方案1】:

    这取决于“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 的值不包含任何引号 - 所以我的意思是我所说的,虽然它可能没有那么明显。)

    【讨论】:

    • 另一个例子是cd vs sh -c cd。第一个将当前目录更改为主目录,而第二个什么也不做。
    • @tom:确实,更复杂的是,根本没有 cd 二进制文件供 exec*() 函数执行。类似的 cmets 适用于其他 shell 内置函数 — exit, jobs, ...
    【解决方案2】:

    来自手册页:

    -c 字符串 如果存在 -c 选项,则从字符串中读取命令。如果字符串后面有参数,则将它们分配给位置参数,从 $0 开始。

    cmd 将通过 bash(或任何您的默认值)shell 运行。您需要 sh 显式调用 -c 参数。

    exec 在这里不应该有所作为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-30
      • 2017-12-15
      • 2011-09-03
      • 2022-06-28
      • 1970-01-01
      • 1970-01-01
      • 2016-09-24
      相关资源
      最近更新 更多