Computer >> 컴퓨터 >  >> 시스템 >> Linux

리눅스 tee 명령어 완벽 가이드: 화면 출력과 파일 저장을 동시에 하기

리눅스 셸에서 파이프(|)나 리다이렉션(>)을 자주 사용한다면, 언젠가는 tee 유틸리티도 꼭 필요하게 될 것입니다. 이 글에서는 tee 명령어의 기본 개념부터 실무에서 유용하게 쓰이는 다양한 활용법까지 자세히 살펴보겠습니다.

tee 명령어란 무엇을 하는가?

먼저 다음과 같은 간단한 명령어를 생각해 봅시다.

ls

이 명령은 현재 디렉터리의 내용을 화면에 표시합니다. 좀 더 정확히 말하면, 표준 출력(stdout), 즉 일반적으로 여러분의 화면 또는 가상 터미널 디스플레이로 결과를 보내는 것입니다.

반면 다음과 같은 명령어를 실행하면 어떻게 될까요?

ls > file123

화면에는 아무것도 나타나지 않습니다. 그 이유는 > 기호가 모든 출력을 화면 대신 파일로 리다이렉션하기 때문입니다. 그 결과 file123 파일에는 원래 화면에 표시되었을 내용이 저장됩니다.

그렇다면 디렉터리 내용을 화면에도 보여주고 동시에 파일에도 저장하려면 어떻게 해야 할까요? 별도의 명령을 두 번 실행해야 할 것 같지만, tee를 사용하면 한 번에 두 가지 작업을 모두 처리할 수 있습니다.

ls | tee file123

같은 명령을 두 번 실행하면 되는데 굳이 tee를 써야 할까?

위 예제에서는 ls를 그냥 실행한 다음, 다시 실행해서 출력을 파일로 리다이렉션하면 되므로 tee가 꼭 필요하지 않다고 생각할 수 있습니다. 하지만 출력 결과가 고유하고 재현할 수 없는 상황도 분명 존재합니다.

예를 들어 시스템 문제를 진단하는 상황을 상상해 보세요. diagnose | tee error.log를 실행하면 발생하는 오류 메시지가 매번 다를 수 있습니다. 화면에 오류를 실시간으로 표시하면서 테스트 상황을 확인하고 싶은 동시에, 나중에 검토하거나 커뮤니티 포럼에 붙여넣어 도움을 요청할 수 있도록 파일로도 저장하고 싶을 것입니다. 바로 이럴 때 tee가 빛을 발합니다.

또 하나 자주 마주치는 상황이 있습니다. 명령어의 출력을 root 사용자만 읽거나 쓸 수 있는 위치에 저장하고 싶은 경우입니다. 다음 명령은 실패합니다.

/sbin/blkid > /root/somefile

"그럼 당연히 sudo를 쓰면 되겠네!"라고 생각할 수 있지만, 놀랍게도 아래 명령 역시 작동하지 않습니다.

sudo blkid > /root/somefile

그 이유는 sudo blkid가 실행된 후에도 여러분은 여전히 일반(root가 아닌) 사용자로 로그인되어 있기 때문입니다. 셸(보통 bash)은 여러분의 일반 사용자 권한으로 /root/somefile에 쓰기를 시도하다가 권한 오류로 실패하는 것입니다. 이 문제는 tee를 사용하면 해결됩니다.

/sbin/blkid | sudo tee /root/somefile

내용 덧붙이기와 에러 리다이렉션

tee는 유용하지만 단순한 명령어입니다. 대부분의 경우 command | tee somefile 형태면 충분합니다. 하지만 다음 두 가지 상황에서는 몇 가지 팁을 알아두어야 합니다.

첫째, tee는 기본적으로 항상 파일을 덮어씁니다(overwrite). 먼저 다음 명령을 실행하고,

ls | tee somefile

이어서 다음 명령을 실행해 봅시다.

ls /tmp | tee somefile

두 번째 명령이 somefile의 내용을 덮어써 버리기 때문에, 파일에는 마지막에 실행된 명령의 결과만 남게 됩니다. 이 동작을 바꾸려면 덮어쓰기 대신 내용을 덧붙이도록(append) 설정하면 되는데, 이때 -a 옵션을 사용합니다.

ls | tee -a somefile

둘째, 모든 출력이 동일한 것은 아니라는 점입니다. 에러 메시지는 별도로 처리되며, 화면에는 표시되더라도 표준 출력(stdout)으로 간주되지 않기 때문에 tee가 잡아내지 못합니다. (에러 메시지는 표준 에러(stderr)로 분류됩니다.) grep을 사용한 다음 예제를 통해 확인해 보겠습니다.

grep -r L2TP /etc | tee somefile

이 명령을 실행하면 "Permission denied" 같은 권한 거부 메시지가 화면에 나타납니다. 이 메시지들은 stderr로 기록되는 것이고, stdout으로 기록되는 것은 강조 표시된 검색 결과뿐입니다. 따라서 somefile 파일의 내용을 열어보면 에러 메시지 없이 검색 결과만 담겨 있는 것을 확인할 수 있습니다.

텍스트를 검색하는 grep처럼 이런 경우에는 오히려 에러 메시지가 파일에 저장되지 않는 것이 유용합니다. 불필요한 잡음으로 파일이 지저분해질 뿐이고, 우리가 원하는 것은 찾은 결과뿐이니까요. 하지만 에러 메시지까지 함께 저장해야 한다면, stderr를 stdout으로 리다이렉션하는 2>&1을 사용하면 됩니다.

grep -r L2TP /etc 2>&1 | tee somefile

이 명령을 실행하면 somefile에 에러 메시지까지 함께 저장되는 것을 확인할 수 있습니다.

마무리

이 튜토리얼이 tee 명령어를 최대한 활용하는 데 필요한 모든 내용을 다루었기를 바랍니다. tee 사용 중에 막히는 부분이 있다면 아래에 댓글을 남겨 주세요. 도움을 드릴 수 있을 것입니다.