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.

관련 정보