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


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.