2017-11-03 22 views
1

stdout과 stderr를 timestamp와 함께 로그 파일에 기록하고 화면에 표시하고 싶습니다. stderr을 stdout으로 리디렉션하고 awk와 함께 타임 스탬프를 추가하고 로그 파일에 tee를 추가하십시오. 그러나 올바른 오류 코드를 얻는 데 문제가 있습니다. 여기BASH : stdout과 stderr을 파일로 저장하고 화면에 표시 - 올바른 오류 코드 받기

로깅없이 예 :

$ less notexists.txt 
notexists.txt: No such file or directory 
$ echo $? 
1 

오류 코드가 로깅 정확한 여기서

예이다 : 세 섹션

$ less notexists.txt 2>&1 | awk '{ print strftime("[%Y-%m-%d %H:%M:%S]"), $0; fflush(); }' | tee -a log.txt 
[2017-10-23 17:19:59] notexists.txt: No such file or directory 
$ echo ${PIPESTATUS[*]} 
0 0 0 

에러 코드는 0이지만 첫 번째 섹션에서 1이어야합니다. 문제는 stderr의 리디렉션이 될 수 있다고 생각합니다.

timestamp가있는 stdout 및 stderr을 로그 파일에 기록하고 화면에서보고 올바른 오류 코드를 얻는 방법이 있습니까?

stderr을 리디렉션하는 대신 복제 할 수 있습니까?

+1

문제는 'less'가 터미널 이외의 것을 표준 출력으로 사용한다는 것입니다. '{less noexists.txt; echo $ ?; } | 고양이. – chepner

답변

1

명백하게 표준 출력이 터미널이 아닌 경우 less의 종료 상태는 0이 아닙니다. 당신이 그것을

$ less notexists.txt 2>&1 > /dev/tty | awk '{ print strftime("[%Y-%m-%d %H:%M:%S]"), $0; fflush(); }' | tee -a log.txt 
#       ^^^^^^^^^^ 

을 강제하는 경우 더 이상 로그 파일의 표준 출력을 얻을 수 있습니다하지만 당신은, 예상 종료 상태를 얻을 수 있습니다. 여기


은, 내 생각, less v487에서 관련 코드입니다 : 표준 출력이 터미널이 아닐 때 그래서

if (!is_tty) 
     { 
       /* 
       * Output is not a tty. 
       * Just copy the input file(s) to output. 
       */ 
       SET_BINARY(1); 
       if (nifile() == 0) 
       { 
         if (edit_stdin() == 0) 
           cat_file(); 
       } else if (edit_first() == 0) 
       { 
         do { 
           cat_file(); 
         } while (edit_next(1) == 0); 
       } 
       quit(QUIT_OK); 
     } 

그것을 열려고하는 오류를 무시 제외 less은 단순히 cat처럼 동작 그것의 입력. 어떤 일이 일어나 든 방금 0을 종료합니다.

아마도이 버그는 있지만 2 분 동안 소스 코드를 조사한 결과이므로이 동작의 근거가 있는지 여부는 알 수 없습니다.

+0

버그 보고서를 제출했습니다. 관리자의 생각으로 다시보고하겠습니다. – chepner