我从来没有真正考虑过shell如何实际执行管道命令。一直有人告诉我,“一个程序的标准输出通过管道传递到另一个程序的标准输入中”,作为思考管道的一种方式。因此,我自然而然地认为A | B,A将首先运行,然后B获得A的标准输出,并使用A的标准输出作为其输入。
但是我注意到,当人们在ps中搜索特定进程时,他们会在命令末尾包含grep -v“ grep”,以确保grep不会出现在最终输出中。这意味着在命令ps aux | grep“ bash” | grep -v“ grep”,这意味着ps知道grep正在运行,因此在ps的输出中。但是,如果ps在其输出通过管道传递到grep之前完成运行,它怎么知道grep正在运行?
flamingtoast@FTOAST-UBUNTU: ~$ ps | grep ".*"
PID TTY TIME CMD
3773 pts/0 00:00:00 bash
3784 pts/0 00:00:00 ps
3785 pts/0 00:00:00 grep