ps 输出中如何呈现管道进程?

ps 输出中如何呈现管道进程?

我有一个非常简单的脚本,它监视 /tmp 目录中的新文件,并将输出通过inotifywait管道传输到sed

#!/bin/bash

/usr/local/bin/inotifywait -q -m /tmp --format %f | sed 's/a/b/'

如果我检查 then 的输出,pstree我可以看到inotifywaitsed确实都在运行:

  |-bash(20568)---test(8208)-+-inotifywait(8209)
  |                          `-sed(8210)

inotifywait现在,如果我将while 循环的输出通过管道传输到,而不是直接传输到sed

#!/bin/bash

/usr/local/bin/inotifywait -q -m /tmp --format %f | 
  while IFS= read -r file; do
    sed 's/a/b/' "$file"
  done

..然后根据pstree

    |-bash(20568)---test(8979)-+-inotifywait(8980)
    |                          `-test(8981)

..ps和 :

$ ps -p 8981 -o command
COMMAND
/bin/bash ./test
$

..启动的是 shell,而不是外部实用程序sed。我是否正确,这只是因为shellwhilebash内置的?

答案1

管道中进程的关系主要取决于您使用的外壳。

现代 shell 使管道中的所有简单进程(命令)成为主 shell 的直接子代。

较旧的 shell 以不同的特定于实现的方式执行此操作。

当输入重定向时,某些 shell 在子 shell 内运行 while 循环,而其他 shell 则不会。

while不是 shell 内置命令,而是 shell 语法的一部分。

结论:不要尝试分析复杂 shell 命令中的父子关系,除非您是该 shell 的作者并且喜欢检查在该特定 shell 中事情是否按照当前预期的方式工作。

相关内容