Shell
為什麼 mawk 的輸出(STDOUT)即使是終端也會被緩衝?
我知道它
STDOUT
通常由mawk
(但不是gawk
)grep
、、、等命令緩衝sed
,除非與適當的選項(即mawk --Winteractive
、或grep --line-buffered
、或sed --unbuffered
)一起使用。STDOUT
但是當是終端/tty時不會發生緩衝,在這種情況下它是行緩衝的。現在,我不明白為什麼
STDOUT
在循環外部緩衝發送到管道,即使最終目的地是終端。一個基本的例子:
$ while sleep 3; do echo -n "Current Time is ";date +%T; done | mawk '{print $NF}' ^C
很長一段時間都沒有發生任何事情,因為
mawk
似乎正在緩衝它的輸出。我沒想到。
mawk
的輸出是終端,為什麼要STDOUT
緩衝呢?實際上,使用該
-Winteractive
選項,輸出每 3 秒渲染一次:$ while sleep 3; do echo -n "Current Time is ";date +%T; done | mawk -Winteractive '{print $NF}' 10:57:05 10:57:08 10:57:11 ^C
現在,這種行為顯然是
mawk
相關的,因為如果我使案例如grep
. 即使沒有它的--line-buffered
選項,grep
也不會緩衝它STDOUT
,這是預期的行為,因為grep
’sSTDOUT
是終端:$ while sleep 3; do echo -n "Current Time is ";date +%T; done | grep Current Current Time is 11:01:44 Current Time is 11:01:47 Current Time is 11:01:50 ^C
並不是它在緩衝它的輸出。
mawk
是我知道緩衝其輸入的唯一實用程序。另請參閱https://github.com/ThomasDickey/original-mawk/issues/41#issuecomment-241070898
換句話說,
mawk
它不會開始處理它的輸入(更不用說列印任何東西,如果該處理涉及列印),直到它積累了一個充滿輸入的緩衝區。您可以通過執行來驗證它:
(echo 1; sleep 1; echo 2) | mawk '{system("echo "$1)}'
可以使用該
-Winteractive
選項禁用它。請注意,-Winteractive
無論 的值如何,記錄都是行RS
。