壳牌高管和管道

ech*_*ata 3 bash shell command-line pipe exec

我正在使用bash,据我所知,exec后跟一个命令应该替换shell而不创建新进程.例如,

exec echo hello
Run Code Online (Sandbox Code Playgroud)

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

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

exec echo hello | sed 's/hell/heck/'
Run Code Online (Sandbox Code Playgroud)

要么

echo hello | exec sed 's/hell/heck/'
Run Code Online (Sandbox Code Playgroud)

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

Mac*_*cha 5

bash手册中有句子:

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

因此,在两个示例中,两个进程首先由管道生成,并且'exec'在生成的进程中执行 - 而不会影响执行管道的shell.