我有一个非常简单的脚本,它监视 /tmp 目录中的新文件,并将输出通过inotifywait
管道传输到sed
:
#!/bin/bash
/usr/local/bin/inotifywait -q -m /tmp --format %f | sed 's/a/b/'
如果我检查 then 的输出,pstree
我可以看到inotifywait
和sed
确实都在运行:
|-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
。我是否正确,这只是因为shellwhile
是bash
内置的?
答案1
管道中进程的关系主要取决于您使用的外壳。
现代 shell 使管道中的所有简单进程(命令)成为主 shell 的直接子代。
较旧的 shell 以不同的特定于实现的方式执行此操作。
当输入重定向时,某些 shell 在子 shell 内运行 while 循环,而其他 shell 则不会。
while
不是 shell 内置命令,而是 shell 语法的一部分。
结论:不要尝试分析复杂 shell 命令中的父子关系,除非您是该 shell 的作者并且喜欢检查在该特定 shell 中事情是否按照当前预期的方式工作。