Linux tee 명령어 사용법 3가지 및 쓰는 이유

echo 명령어로 문자열을 파일로 저장하는데 permission denied 에러 메시지를 만났나요? tee 명령어를 쓰면 문제를 해결할 수 있습니다. 그 tee 명령어를 사용하는 이유와 tee 명령어 사용법을 알아보도록 하겠습니다.

tee 명령어 사용하는 이유

리눅스에서 출력 결과를 파일로 저장할 때 리디렉션 연산자(redirection operator) >이나 >>을 사용할 때가 있습니다. 그런데 굳이 tee를 써야 할 이유가 있을까요? 왜 tee 명령어를 사용하는 것일까요?

쓰고자 하는 파일의 소유주와 명령어를 실행하는 당사자가 동일하다면 아래의 코드는 동일한 기능을 합니다. 얼핏보면 코드는 리디렉션 연산자가 훨씬 짧고 간편합니다. 그냥 리디렉션 연산자를 써도 상관이 없습니다.

echo "TEST=1234" > testfile
echo "TEST=1234" | tee testfile > /dev/null
ShellScript

혹시 감이 오셨나요? 그렇습니다. 파일의 소유자와 명령어 실행자가 동일하지 않을 때가 문제입니다. testfile의 소유자와 그룹을 root로 변경해 보겠습니다.

sudo chown root:root testfile
ShellScript

이제 동일한 명령어를 실행해 보면 당연히 그 결과는 퍼미션 거부됨(permission denied)입니다. 다른 소유자이며 그룹의 권한 조차 없으니까요. 심지어 sudo 명령을 echo 앞에 붙여도 마찬가지입니다. 그럴 수 밖에 없는 게 sudo로 실행하는 명령어가 >> 연산자가 아니라 echo이기 때문이죠.

그림 1. tee 명령어 사용하지 않고 리디렉션 이용시 permission denied 에러 메시지 발생
그림 1. tee 명령어 사용하지 않고 리디렉션 이용시 permission denied 에러 메시지 발생

이와 같은 경우에는 아래와 같이 sudo 명령어와 tee 명령어를 함께 사용하면 문제를 해결할 수 있습니다.

echo "TEST=1234" | sudo tee testfile > /dev/null
ShellScript

그럼 이제 tee 명령어의 사용법을 확인해 보겠습니다.

tee 명령어 사용법

파일로 저장

위와 같이 해당 input을 파일로 저장하는 명령어는 tee FILE을 사용하면 입력받은 문자열을 파일로 저장해 줍니다. 기존에 파일이 있다면 기본적으로 덮어씌웁니다.

파일에 추가

파일을 덮어씌우지 않고 파일 뒤에 추가하는 리디렉션 연산자 >>처럼 사용하려면 아래와 같이 -a 옵션을 사용하면 됩니다.

echo "TEST=1234" | sudo tee -a testfile
ShellScript

표준 출력 하지 않을 때

그리고 tee 명령어는 표준 입력(standard input)에서 읽고 표준 출력(standard output)도 하면서 동시에 파일(file)에도 쓸 때 사용합니다. 기본적으로 표준 출력이 이뤄집니다. 표준 출력이 되지 않게 하려면 널 디바이스(null device)인 /dev/null로 연결해 주면 표준 출력 장치인 터미널에 표시되지 않습니다.

echo "TEST=1234" | sudo tee -a testfile > /dev/null
ShellScript

정리

간단히 tee 명령어를 사용해야 하는 이유와 사용방법을 살펴봤습니다. echo 명령어를 사용할 때 permission denied로 고민하셨던 분들께 도움이 되길 바랍니다.

관련 자료

tee 명령어의 man page를 참고했습니다.

같이 읽으면 좋은 글

Leave a Comment