linux tee 명령어 사용법
개요
tee 는 표준 입력(standard input)에서 읽어서 표준 출력(standard output) 과 파일에 쓰는 명령어입니다.
다음 명령을 실행하면 OUTFILE 에 hello 라는 내용이 기록됩니다.
echo "hello" | tee OUTFILE
위 명령어를 활용하면 간단한 텍스트 파일 복사를 tee 를 이용해서 구현할 수 있으며 다음 명령어는 OUTFILE 을 NEWFILE 로 복사합니다
cat OUTFILE | tee NEWFILE
echo 사용시 shell 의 append 연산자인 >> 를 사용하려면 -a 나 --append 옵션을 사용하면 됩니다.
echo "hello" | tee -a OUTFILE
tee 는 표준 입력에서 읽은 내용을 표준 출력에도 쓰므로 화면에도 표준 입력에서 읽은 내용이 표시됩니다.
즉 다음 명령어를 실행하면 OUTFILE 과 터미널에 모두 "hello world" 가 표시됩니다.
echo "hello world" | tee OUTFILE hello world
표준 출력에는 쓰지 않으려면 tee 의 맨 마지막에 널 디바이스인 /dev/null 을 연결해 주면 표준 출력 장치(예: 터미널)에는 표시 되지 않습니다.
echo "hello world" | tee -a OUTFILE /dev/null
왜 tee 를 써야 하는가?
tee 의 사용 설명을 읽어도 echo 나 cat 등에 IO redirection 연산자를 사용하면 될텐데 왜 tee 가 필요한지 궁금증이 생길 수 있습니다.
즉 다음과 같이 echo 로 써도 되는데 왜 tee 로 다시 한 번 받아야 하는지 궁금할텐대요.
echo "hello world" >> OUTFILE
echo "hello world" | tee -a OUTFILE
shell 에서 출력을 redirection 할 경우 sudo를 사용해도 일반 사용자로 전환 되므로 root 권한으로 파일에 쓰거나 내용 추가가 필요한 경우 제대로 동작하지 않습니다.
그래서 아래와 같이 root 소유인 파일에 sudo echo 를 실행하면 "permission denied" 에러가 나고 내용 추가에 실패합니다.
sudo echo "validate_password.policy=LOW" >> /etc/mysql/mysql.conf.d/mysqld.cnf
이럴 경우 echo 를 받아서 sudo tee 를 하면 정상적으로 동작하며 tee 는 shell script 에서 root 권한으로 특정 파일을 쓰거나 append 할때 주로 활용합니다.
echo "validate_password.policy=LOW" | sudo tee -a /etc/mysql/mysql.conf.d/mysqld.cnf