make 로그를 파일에 기록하면서 화면에 출력하기. Shell 명령어 tee
요약
make 로그를 파일에 기록하면서 화면에 출력하려면 아래 명령을 실행하면 됩니다.
make 2>&1 | tee -a make.log
Situation
큰 프로젝트를 컴파일 하는데 컴파일 로그를 분석해야했습니다. 로그가 엄청난 양이 발생하니 파일로 기록해야 분석할 수 있었고, 컴파일 진행상황도 알아야하니 화면으로 출력도 해야했습니다.
Task
- make
- 출력 로그를 기록
- 기존의 화면 출력 로그 유지
Action
스크립트 한줄이지만, 알아야할 개념이 이렇습니다.
- Redirect and Pipe
- 표준 입출력 : stdin, stdout, stderr
- tee
각각의 개념에 대해 블로깅을 하게 되면 링크를 달기로 하고, 이번에는 make의 출력과 tee 사용법에 대해서 말씀드리도록 하겠습니다.
make
일단 make를 하면 컴파일 로그들이 출력됩니다.
$ make ccache g++ -std=c++11 -Wall main.cpp -oleetcode -lgtest -lpthread main.cpp: In member function ‘std::string Solution::longestPalindrome(std::string)’:
make 출력후 나오는 로그가 같은 로그(?)가 아닙니다. ccache로 시작하는 로그는 stdout, 이탤릭체는 stderr입니다. 그래서 make > build.log 를 하면 stdout 만 build.log에 기록되는 것입니다. stderr 을 stdout 으로 보내면 해결되겠죠?
make 2>&1 > build.log
tee 명령어 사용법
위의 명령을 실행하면 문제가 stdout을 build.log에 리다이렉트하므로 화면에 출력하는 내용이 없습니다. make 현재 상황을 알 수 없는거지요. 이때 필요한 명령이 tee입니다.
$ make stdin -> tee -> stdout -> <file>
tee는 stdin(표준입력)을 stdout으로 보내면서 파일로 기록해주는 명령어입니다. pipe로 들어온 stdin을 파일에 기록하고 stdout 화면으로도 볼 수 있습니다.
make 2>&1 | tee -a make.log
-a 옵션은 파일이 있을 경우 append 합니다.
Result
make 로그 화면에 출력하고 파일에 기록하는 간단한 Task를 하는데 뭔가 알아야할게 많네요.
댓글
댓글 쓰기