Shell
關閉管道中的緩衝
我有一個呼叫兩個命令的腳本:
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()
…),並且僅當該應用程序不自行調整其標準流的緩衝時,儘管這應該涵蓋大多數應用程序。