【问题标题】:Shell exec and pipes壳牌执行和管道
【发布时间】:2014-02-19 10:35:32
【问题描述】:

我正在使用 bash,据我了解,exec 后跟一个命令应该在不创建新进程的情况下替换 shell。例如,

exec echo hello

有打印“hello”然后立即退出的样子,因为echo完成后,shell进程不再返回。

如果我把它作为管道的一部分 - 例如,

exec echo hello | sed 's/hell/heck/'

echo hello | exec sed 's/hell/heck/'

我的期望是,同样地,shell 会因为它的进程被替换掉而终止。然而,这并不是现实中发生的事情——上面的命令都打印“hecko”并正常返回到 shell,就好像“exec”这个词不存在一样。这是为什么呢?

【问题讨论】:

    标签: bash shell command-line exec pipe


    【解决方案1】:

    bash手册中有一句话:

    管道中的每个命令都作为一个单独的进程执行(即,在 一个子shell)。

    因此,在这两个示例中,两个进程首先由管道生成,“exec”在其中一个生成的进程中执行 - 对执行管道的 shell 没有影响。

    【讨论】:

    • 对。另一个不影响母壳的例子是使用括号创建子壳:(exec echo hello).