mawkの出力(STDOUT)が端末にもバッファリングされるのはなぜですか?

mawkの出力(STDOUT)が端末にもバッファリングされるのはなぜですか?

STDOUT適切なオプション(たとえば、または、または)と一緒に使用しない限り、通常は、などのコマンドによってバッファリングされることがわかります。ただし、ターミナル/ttyの場合、バッファリングは発生しません。この場合、ラインバッファリングされます。mawkgawkgrepsedmawk --Winteractivegrep --line-bufferedsed --unbufferedSTDOUT

今私が理解していないのは、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されません。これはsが端末であるSTDOUTため、予想される動作です。grepSTDOUT

$ 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

ベストアンサー1

バッファリングをするわけではありません。出力

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

おすすめ記事