Shell

為什麼 mawk 的輸出(STDOUT)即使是終端也會被緩衝?

  • June 25, 2021

我知道它STDOUT通常由mawk(但不是gawkgrep、、、等命令緩衝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

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