管道是否並行執行命令?

管道是否並行執行命令?

我試圖更深入地了解管道和重定向。在每個指南中都說cmd1 | cmd2cmd1 將執行,並且 stdout 將與 cmd2 的 stdin 共用。但這在我看來不太好,所以我測試了它:

所以看起來都是 ./test.shgrep 正在運行平行線!

這是原始碼:

#!/bin/bash
a=0
while :
do
        ((a=a+1))
        echo "Line number $a"
        sleep 1
done

嘗試使用不同的推薦會顯示類似的結果。 管道是否平行運作?

管道和重定向如何“在幕後”工作?

答案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.

直接回答你的兩個直接問題

  1. 管道是否平行運行

不,不一定。至少不是在普通的「並行」(tandem)的意思。

pipe 開火(發起)2工作同時。即便是相同的工作兩次

  1. 管道和重定向如何“在幕後”工作?

我希望我在上面已經為您更好地說明了這一點。 :)

或者

cat ./ASCII | grep somename >./output

以上cat ./ASCII輸出( stdout)。這變成了輸入( stdin) 透過管道|) 為了grep somename。這是(重新)導演( >) 到其最終輸出./output

相關內容