티는 파이프에서 전체 출력을 얻지 못합니다


12

다음과 같은 명령을 실행하는 스크립트가 있습니다.

export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH;./some_app -i $INDEX | tee $LOG
echo "Number of errors: $(grep "ERROR" $LOG | wc -l)"

파이프에 문제가있을 수 tee있습니다. 전체 출력을 얻지 못하는 것 같습니다. 응용 프로그램이 마지막으로 종료되면 출력의 몇 줄 (일반적으로 치명적인 오류가있는 줄)이 누락됩니다. 파이프없이 앱을 실행 tee하면 출력으로 가져옵니다.

티가 모든 출력 처리를 완료 할 때까지 스크립트가 강제로 대기하도록하려면 어떻게해야합니까?


stdout이 아닌 파일에 티킹하면 정상적으로 작동합니까?
Pilot6 2016 년

답변:


23

치명적인 오류는 아마도 STDOUT (1)이 아닌 STDERR (2)에서 나올 것입니다. STDERR을 STDOUT으로 리디렉션 2>&1하면 파이프도이를 캡처해야합니다.

./some_app -i $INDEX 2>&1 | tee $LOG

버퍼링 문제가있는 경우 버퍼링되지 않은 상태로 만들 수 있습니다.

stdbuf -o0 ./some_app -i $INDEX 2>&1 | tee $LOG

좋아, 점점 가까워지고있어 이제 치명적 오류가 인쇄되고 있지만 다시 완료되지 않았습니다. 오류가있는 줄은 중간에서 끝나고 에코 출력이 계속됩니다. 여전히 플러시 버퍼에 문제가 있거나 단순히 해당 부분이 완료되기를 기다리는 중입니다.
Ladislav Mrnka 2016 년

편집했습니다. 내 경험상 매우 드물게 종료시 버퍼가 완전히 빠져 나가지 만 가치가 있습니다.
Oli

1
끝난! 감사합니다. 너무 많은 질문을 할 수 있지만 다른 프로세스로 파이핑 할 때 버퍼링을 해제해야하는 이유를 아는 사람이 있습니까?
Ladislav Mrnka 2016 년

@Oli 아주 좋은 것!
Pilot6

6

오류 메시지가 일반적으로 STDERR (파일 설명자 2)에 표시되므로 STDOUT 및 STDERR을 모두 다음으로 경로 재지 정해야합니다 tee.

./some_app -i "$INDEX" |& tee "$LOG"

당신이 ./some_app -i $INDEX | tee $LOG할 때만 STDOUT을로 리디렉션합니다 tee.

|& STDOUT 및 STDERR이 모두 리디렉션됩니다.

STDOUT 만 리디렉션 할 수없는 경우 (있는 그대로) :

./some_app -i "$INDEX" | tee "$LOG"

반면에 STDERR 만 리디렉션하려는 경우 :

./some_app -i "$INDEX" 2>&1 >/dev/null | tee "$LOG"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.