linux tee 명령어
개요
tee는 표준 입력(standard input)에서 읽어서 표준 출력(standard output)과 파일에 쓰는 명령어입니다.
다음 명령어를 실행하면 OUTFILE에 hello라는 내용이 기록됩니다. (단, 이 명령어는 OUTFILE에 hello라는 내용이 덮어씌어지는 것으로, 전에 있던 내용물은 사라지게 됩니다.)
$ echo "hello" | tee OUTFILE
다음 명령어는 OUTFILE을 NEWFILE로 복사합니다.
$ cat OUTFILE | tee NEWFILE
echo 사용시 shell의 append 연산자인 >> 를 사용하려면, -a 나 --append 옵션을 사용하면 됩니다.
$ echo "hello" | tee -a OUTFILE
표준 출력에는 쓰지 않으려면 tee의 맨 마지막에 널 디바이스인 /dev/null을 연결해 주면 표준 출력 장치(예: 터미널)에는 표시되지 않습니다.
$ echo "hello world" | tee -a OUTFILE >/dev/null
왜 tee 를 써야 하는가?
tee 를 사용하지 않고 아래와 같이 echo 의 IO redirection 연산자를 사용하여도 파일에 append 할 수 있습니다.
$ echo "hello world" >> OUTFILE
그렇다면 왜 tee를 쓰는 걸까요?
답은 권한에 대한 문제를 보면 알 수 있습니다.
shell에서 출력을 redirection 할 경우, sudo를 사용해도 일반 사용자로 전환되므로 root 권한으로 파일에 쓰거나 내용 추가가 필요한 경우 제대로 작동하지 않습니다.
그래서 아래와 같이 root 소유인 파일에 sudo echo 를 실행하면 "permsission denied" 에러가 나고 내용 추가에 실패합니다.
$ sudo echo "hello" >> /etc/zshrc
>> zsh: permission denied: zshrc
이럴 경우 echo를 받아서 sudo tee를 하면 정상적으로 동작합니다.
$ echo "hello" | sudo tee -a zshrc
이와 같이 tee는 shell script에서 root 권한으로 특정 파일을 쓰거나 append 할 때 주로 사용합니다.
다수의 문장 추가할 경우
$ tee -a multiple.txt <<EOF
Hello World.
It is such a beautiful day!
EOF