Grep이 파이프로 출력하지 못합니까?

Grep이 파이프로 출력하지 못합니까?

make 출력의 grep 필터링에 문제가 있습니다. 특히,

make target 2>&1 | grep -E --color=never "^make.*"

예상대로 작동하지만 다음은 콘솔에 출력을 인쇄하지 않습니다.

make target 2>&1 | grep -E --color=never "^make.*" | cat

나는 분명한 것을 놓치고 있습니까? 첫 번째 명령은 출력되지만 두 번째 명령은 출력되지 않는 이유는 무엇입니까? 일종의 IO 버퍼링과 관련이 있습니까? 아니면 내가 멍청한 걸까?

[편집하다]: cat는 내가 사용하려는 실제 명령에 대한 최소한의 테스트 사례 자리 표시자일 뿐입니다.

[편집하다]:grep을 다음으로 대체하면 grep에는 문제가 없는 것 같습니다.확인같은 행동으로 이어집니다.

[편집하다]:cat이 다음에 대한 자리 표시자라는 스크립트:

#!/bin/bash
cat - \
 | grep -E --color=never "^.*warning:.*|^.*error:.*|^make.*[Ee]rror.*|^make.*" \
 | hilite.sh -r "^.*warning:.*" -f yellow -B \
 | hilite.sh -r "^.*error:.*" -f red -B \
 | hilite.sh -r "^make.*[Ee]rror.*" -f red -B \
 | hilite.sh -r "^make.*" -f magenta

[편집하다]:버퍼링/IO 문제인 것 같습니다. 나는 w/e를 통해 실행되는 빌드를 남겨두고 결국 필요한 곳에서 출력을 얻는지 확인할 것입니다!

답변1

아마도 grepTTY에 쓰지 않는다는 것을 감지하여 일반적인 라인 버퍼 모드(즉, 발견된 각 라인을 볼 수 있음)로 작동하는 대신 더 많은 출력을 버퍼링할 것입니다. 이 동작은 시스템 호출 수가 적기 때문에 더 효율적이지만 write(), 파이프라인 출력을 기다리는 사용자라면 약간 오해의 소지가 있을 수 있습니다.

GNU를 사용하고 있다면 grep(그리고 Linux 태그를 기반으로 한다면) 더 친숙한 라인 버퍼 모드에서 작동하도록 --line-buffered강제하는 옵션을 확인하세요. grep이는 기술적으로 (맨 페이지에 언급된 대로) 성능을 저하시킬 수 있지만 grep라이브 빌드의 출력을 보고 있으므로 그 점에서 어떤 차이가 있을지 의심됩니다.

답변2

명령이 무엇을 해야 할지 잘 모르겠습니다. 파일 이름에 make.*가 포함된 파일을 분류하시겠습니까?

? cat를 변경해 보세요 .xargs cat

답변3

예를 들어 다음 과 같이 실험해 볼 수 있습니다 unbuffer.

make target 2>&1 | unbuffer -p grep -E --color=never "^make.*" | cat

관련 정보