我知道它确实(通常)包括 grep 进程,并且我知道添加 | grep -v grep
或 grepping[f]oo
会阻止它,但我的问题更多是关于我猜的操作顺序。
例如,在这个人为的例子中,我看到了几个 grep 进程:
% ps -x | grep login | grep login | grep login | grep login
2475 ?? 0:00.03 /usr/libexec/loginitemregisterd
2115 ttys004 0:00.04 login -fp jasonerickson
29715 ttys004 0:00.00 grep login
29716 ttys004 0:00.00 grep login
29717 ttys004 0:00.00 grep login
29718 ttys004 0:00.00 grep login
这告诉我ps -x
必须在该行最后执行,因为它列出了所有后续的 grep 命令。但是,它并不一致。有时它会列出 4 或 3 或 2 个,甚至没有 grep 进程。这对我来说意味着它并不总是最后的。
这是怎么回事?
正如 Bravo 所指出的,Linux 中的管道不是文件,它是动态的。所以
ps -x | grep login
实际上会同时启动两个程序,这样一个可以向下倾斜,另一个可以捕捉。它不是确定性的,为什么您的人为示例并不总是显示四个grep
实例的原因是,一个实例可能不会启动,直到管道中有事情要做;ps
或者在读取进程列表时,有问题的实例可能没有完全启动。Unix是一个多任务操作系统。它不会首先或最后启动 ps。它并行启动管道中的所有事情。有些可能先完成或在 ps 开始后开始,这就是你的比赛的来源,这使得结果有点不确定。
基本上,这里没有操作顺序。管道是数据流,而不是数学公式。
unix 中管道的美妙之处在于,第二个程序可以在第一个程序完成之前开始处理输入,因此无需在将整个数据流收集并存储在内存(或磁盘)中之前将其提供给下一个程序管子里的东西。