STDOUT
適切なオプション(たとえば、または、または)と一緒に使用しない限り、通常は、などのコマンドによってバッファリングされることがわかります。ただし、ターミナル/ttyの場合、バッファリングは発生しません。この場合、ラインバッファリングされます。mawk
gawk
grep
sed
mawk --Winteractive
grep --line-buffered
sed --unbuffered
STDOUT
今私が理解していないのは、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
ため、予想される動作です。grep
STDOUT
$ 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
。