Shell

關閉管道中的緩衝

  • May 2, 2021

我有一個呼叫兩個命令的腳本:

long_running_command | print_progress

列印進度,long_running_command但我對此不滿意。我print_progress用來使它更好(即,我在一行中列印進度)。

**問題:**將管道連接到 stdout 也會啟動 4K 緩衝區,因此漂亮的列印程序什麼也得不到……什麼都沒有……什麼都沒有……一大堆…… :)

如何禁用(不,我沒有源)的4K緩衝區?long_running_command

您可以使用unbuffer命令(作為expect包的一部分提供),例如

unbuffer long_running_command | print_progress

unbuffer通過偽終端 (pty)連接long_running_command,這使得系統將其視為互動式程序,因此不使用可能導致延遲的管道中的 4-kiB 緩衝。

對於更長的管道,您可能必須取消緩衝每個命令(最後一個命令除外),例如

unbuffer x | unbuffer -p y | z

給這隻貓換皮的另一種方法是使用該stdbuf程序,它是 GNU Coreutils 的一部分(FreeBSD 也有自己的)。

stdbuf -i0 -o0 -e0 command

這將完全關閉輸入、輸出和錯誤的緩衝。對於某些應用程序,出於性能原因,行緩衝可能更適合:

stdbuf -oL -eL command

請注意,它僅適用於動態連結應用程序的stdio緩衝 ( printf(), fputs()…),並且僅當該應用程序不自行調整其標準流的緩衝時,儘管這應該涵蓋大多數應用程序。

引用自:https://unix.stackexchange.com/questions/25372