
答案1
是的,所有命令同時運行。在您的情況下,grep
與 同時啟動test.sh
,但由於它讀取其標準輸入,因此它會被阻止,直到test.sh
將某些內容放入其中為止,這不會立即發生。這兩個進程相互配合,如果第二個進程很慢,第一個進程將填滿它的標準輸出緩衝區,並等待第二個進程讀取一些內容。如果第一個很慢,則第二個在讀取輸入(如果沒有可用的輸入)時會被阻塞。
在現實生活中,第一個進程的標準輸出是以相當大的區塊(大約4K)(*) 寫入的,因此第二個進程沒有任何內容可讀取,直到第一個進程寫入至少4K的數據。您的test.sh
使用echo
可能有點不同,並進行行緩衝輸出。
(*) 規則是,如果輸出到「tty」(即終端),則它是行緩衝的:輸出中的 LF 會導致實際輸出發生。否則,它會按 4K 區塊進行緩衝。第一個進程還可以明確抑制所有緩衝,但這對效能不利。
答案2
你真的再次關注什麼是所謂的flow control
、和/或(重新)方向;flow control
, 或stdin
, stdout
(標準輸入/標準輸出)。
我希望我上述的陳述可以幫助您更好地理解什麼是故意的發生,以及你可以做得更好預計。
管道,或「管道」stdout
,僅僅指揮 stdout
在多數情況下。
平行是真的的另一個名字串聯。你可以試圖同時運行 2 個不同/相同的命令/輸出。但期待一個同步的run 是不明智的,因為它不太可能發生。
以你為例;這裡要跟大家介紹什麼叫有條件的。與路標或交通燈非常相似。這些有條件的(數)直接的 流動基於一個狀態。在你的例子中,儘管"狀態" --儘管 這, 做那。條件一般重定向 stdin
, stdout
.
直接回答你的兩個直接問題
- 管道是否平行運行
不,不一定。至少不是在普通的「並行」(tandem)的意思。
但 pipe
能開火(發起)2工作同時。即便是相同的工作兩次。
- 管道和重定向如何“在幕後”工作?
我希望我在上面已經為您更好地說明了這一點。 :)
或者
cat ./ASCII | grep somename >./output
以上cat ./ASCII
是輸出( stdout
)。這變成了輸入( stdin
) 透過管道(|
) 為了grep somename
。這是(重新)導演( >
) 到其最終輸出./output
。