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를 하는데 뭔가 알아야할게 많네요.

Reference

GNU Manual : Redirection


댓글

이 블로그의 인기 게시물

WSL2 Ubuntu 20.04 및 네트워크 설정

리눅스 멀티코어를 사용하는 tar 압축/해제

git pull 을 했더니 branch가 갈라지는 경우