我通常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
您可以使用-u
sed 的選項來最小化緩衝:
cat | sed -u '' | sed ''