sklass의 s-class 프로그래밍 blog

linux tee 명령어 본문

shell

linux tee 명령어

sklass 2021. 9. 4. 15:32

개요

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

'shell' 카테고리의 다른 글

iTerm2 단축키 정리  (0) 2021.12.20
rsync  (0) 2021.10.12
Visual Studio Code에서 code 명령어 영구적으로 설정하는 법(MacOS)  (0) 2021.08.21
.bash_profile VS .zshrc  (0) 2021.08.21
Interactive Shell & Login Shell  (0) 2021.08.21