管道和無限流如何運作?

管道和無限流如何運作?

我通常command1 | command2 | command3在Linux中使用很多,但大多數都是處理確定的內容。

當我使用無限流嘗試此操作cat | sed '' | sed ''(希望模擬無限流)時,它不起作用,直到我用 終止它Ctrl-D。我可以透過使用解決問題cat | sed -e '' -e '',但我想知道為什麼第一個不起作用。cat | cat | cat工作得很好。這是否與有關sed,如果是的話,那是什麼問題?

我試圖思考這個問題,我發現唯一不同的是,當我使用時,cat我按下了這個Enter鍵,該鍵做了一些在上面第一個中沒有發生的特殊事情sed ''

誰能告訴我如何讓管道與無限蒸汽無縫工作?

答案1

管道將左側命令的輸出連接到右側命令的輸入。這與流的長度無關。然而,管道中的每個命令仍然有它自己的緩衝規則。如果您不在每個命令中觸發它們,您將不會在最終輸出中看到它們。

答案2

這基本上是重複的我對SO的回答。然而,由於stdbuf這裡沒有人提到這個命令,所以我覺得我也應該在這裡添加它。

===============

基本上,只要資料在管道中可用,從管道讀取的進程就可以逐字節使用資料。然而,只要程式使用 libc 的 std io 函數,例如讀取、寫入等,libc 就會根據程式是否正在寫入終端機來緩衝這些程式的輸入/輸出。

預設情況下,如果程式正在寫入終端,libc 將以行方式緩衝輸出,如果不寫入終端,則以區塊方式緩衝。

在具有 glibc 的 Linux 上,您可以使用以下stdbuf命令影響該行為,如下所示:

stdbuf -oL cat | stdbuf -ioL sed '' | stdbuf -iL sed ''

我為命令使用基於行的輸出緩衝區cat,為第一個sed命令使用基於行的輸入和輸出緩衝區,為最後一個sed命令使用基於行的輸入緩衝區。

答案3

您可以使用-used 的選項來最小化緩衝:

cat | sed -u '' | sed ''

相關內容