Bash Shell exec和管道

Bash Shell exec和管道,bash,shell,command-line,exec,pipe,Bash,Shell,Command Line,Exec,Pipe,我使用的是bash,据我所知,exec后跟一个命令应该在不创建新进程的情况下替换shell。比如说, exec echo hello 具有打印“hello”然后立即退出的外观,因为在echo完成后,shell进程将不再返回 如果我把它作为管道的一部分-例如 exec echo hello | sed 's/hell/heck/' 或 我的期望是,类似地,shell将因其进程被替换而终止。然而,事实并非如此——上面的两个命令都打印“hecko”并正常返回shell,就好像“exec”一词不存在

我使用的是bash,据我所知,exec后跟一个命令应该在不创建新进程的情况下替换shell。比如说,

exec echo hello
具有打印“hello”然后立即退出的外观,因为在echo完成后,shell进程将不再返回

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

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


我的期望是,类似地,shell将因其进程被替换而终止。然而,事实并非如此——上面的两个命令都打印“hecko”并正常返回shell,就好像“exec”一词不存在一样。为什么会这样?

bash手册中有一句话:

管道中的每个命令都作为单独的进程执行(即 子壳)


因此,在这两个示例中,两个进程首先由管道生成,“exec”在其中一个生成的进程内执行,而不会影响shell执行管道。

Right。不影响母shell的另一个示例是使用括号创建子shell:
(exec echo hello)
echo hello | exec sed 's/hell/heck/'