리눅스 tee 명령어는 한 마디로, 입력을 받으면 표준 출력에도 입력 받은 것을 출력하고, 파일로도 출력하는 명령어입니다.
리눅스 tee 명령어
먼저, 설명과 실습에서 쓸 옵션 정도만 보고 넘어가겠습니다.
설명을 보면, standard input에서 읽어서, standard output에 출력하고 파일들에도 출력한다고 되어 있습니다. 이를 그림으로 그리면 아래와 같습니다.
표준 입력으로부터 1을 입력받습니다. 그러면
- 표준 출력으로 1이 출력되고
- 지정한 파일에도 1이 출력됩니다.
이 명령어가 어떤 일을 하는 것인지 이해가 되셨다면 이 글에서 쓸 옵션 하나만 더 보겠습니다.
-a 옵션을 주면, 파일에 내용을 덮어쓰지 않고, 파일 뒤에 결과를 붙이게 됩니다. 밑에 후술하도록 하겠습니다. 이제 예제를 보겠습니다.
tee 명령어 예제
그러면 예제 몇 개를 보겠습니다.
먼저, echo 1과 tee 1.txt를 pipe로 연결하였습니다. 이것은 무엇을 하는 것일까요? 일단, echo 1은 1을 화면에 출력하는 명령어입니다. 이를 tee 명령어와 pipe로 연결했습니다.
echo 1은 오류가 없었으므로, 표준 출력에 1이 쓰여집니다. 이것을 tee 1.txt가 표준 입력으로 받습니다. 다음에, 이 명령어는
- 표준 출력으로도 입력받은 1을 출력하고
- 1.txt에도 출력하게 됩니다.
화면에는 1이 출력되었으니, 1.txt를 볼까요?
1.txt에 1이 출력되어 있습니다. 이는, tee가 표준 출력 뿐만이 아니라, 파일 1.txt에도 1을 출력했기 때문입니다.
이제 echo 2와 tee 1.txt를 pipe로 연결해 보겠습니다. 그러면 어떻게 될까요?
echo 2의 출력 결과는 2입니다. 이것을 후행 명령어 tee가 받아요. 그러면 후행 명령어 입장에서는
- 2가 표준 입력이 됩니다.
- 이 명령어는 표준 출력과 1.txt에 2를 쓰게 되겠네요.
따라서, 해당 명령어를 수행하고 cat 1.txt를 수행하면 2가 출력됩니다.
-a 옵션을 쓰면 어떨까요? echo 3의 결과를 후행 명령어가 표준 입력으로 받았으므로, 1.txt에는 3이 추가될 겁니다. 그런데, -a가 append 이므로, 덮어쓰는 것이 아니라, 기존에 있던 내용에 추가합니다. 기존에는 2만 있었기 때문에, cat 1.txt를 수행하면 2와 3이 출력되게 됩니다.
파일 여러 개에 출력할 수도 있습니다. tee 옵션 뒤에 출력 결과를 저장할 파일들을 여러 개 두면 됩니다. 위 예제는 1.txt와 2.txt에 표준 입력으로 들어온 1을 출력합니다.
2>&1과 tee를 섞어 보았습니다. 위 명령어는 무엇을 의미할까요? 2는 표준 에러, 1은 표준 출력을 의미합니다. 2>&1은 표준 에러를 표준 출력으로 보내라는 의미입니다.
- 디렉토리 c가 없었습니다.
- 표준 에러에 c가 없다는 내용이 있을 겁니다.
- 표준 에러를 표준 출력으로 보냈습니다.
- 표준 출력에 디렉토리 c가 없다는 내용이 들어갑니다.
- 이제 디렉토리 c가 없다는 내용이 tee에 들어갔네요.
따라서, cat 1.txt를 하면, 그런 파일이나 디렉토리가 없습니다: c 라는 에러 메세지가 출력됩니다. 여기까지 리눅스 명령어 tee에 대한 설명이였습니다. 2>&1은 조금 어려웠는데요. 리다이렉션 고급에서 따로 다루도록 하겠습니다.