Shell為什麼
為什麼ps -x |grep foo
是否包含 grep 命令?
我知道它確實(通常)包括 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 中管道的美妙之處在於,第二個程序可以在第一個程序完成之前開始處理輸入,因此無需在將整個數據流收集並儲存在記憶體(或磁碟)中之前將其提供給下一個程序管子裡的東西。