WIPIVERSE

tee (명령어)

tee는 유닉스(Unix) 및 유닉스 계열 운영 체제에서 사용되는 셸 명령어로, 표준 입력(standard input)으로부터 데이터를 읽어 표준 출력(standard output)과 하나 이상의 파일에 동시에 기록하는 역할을 한다. 명령어의 이름은 배관 공학에서 사용되는 T자형 관 이음쇠(tee pipe fitting)에서 유래하였으며, 입력을 여러 출력으로 분할하는 것이 아니라 입력을 각 출력에 그대로 복제(duplicate)한다는 점에서 배관 이음쇠와 유사한 개념이다.

개요

tee 명령어는 파이프(pipe)와 필터(filter)와 함께 자주 사용된다. 파이프라인(pipeline) 중간에 위치하여 데이터 흐름을 분기(branch)함으로써, 중간 결과를 파일에 저장하면서도 화면에 출력을 계속 표시할 수 있게 한다. 이러한 특성 때문에 로그 기록, 디버깅, 데이터 백업 등 다양한 상황에서 활용된다.

역사

tee 명령어는 1974년 6월 AT&T 벨 연구소(Bell Laboratories)에서 최초로 개발되었다. 이후 GNU 버전은 Mike Parker, Richard Stallman, David MacKenzie에 의해 작성되었으며, FreeDOS 버전은 Jim Hall에 의해 개발되어 GPL 라이선스로 배포되었다. ReactOS 버전은 GPLv2, Plan 9 버전은 MIT 라이선스로 제공된다.

지원 운영 체제

tee는 다음과 같은 운영 체제에서 사용할 수 있다:

  • 유닉스(Unix) 및 유닉스 계열 시스템
  • Plan 9, Inferno
  • OS-9
  • MS-DOS / PC DOS 및 호환 시스템
  • Windows (4NT, PowerShell, UnxUtils 등을 통해)
  • ReactOS
  • IBM i

기본 문법 (Unix 계열)

tee [-a] [-i] [파일...]
  • 파일...: 입력 데이터를 저장할 하나 이상의 파일 이름
  • -a (append): 파일을 덮어쓰지 않고 내용을 추가
  • -i (ignore interrupt): 인터럽트 신호를 무시

주요 옵션

옵션 설명
-a 지정한 파일이 이미 존재할 경우 내용을 덮어쓰지 않고 이어서 추가한다.
-i 인터럽트 신호(예: Ctrl+C)를 무시하여 명령 실행 중단을 방지한다.

사용 예시

  1. 출력을 화면에 표시하면서 파일에 저장

    lint program.c | tee program.lint
    

    lint program.c 명령의 실행 결과를 화면에 출력하는 동시에 program.lint 파일에 저장한다. 파일이 이미 존재하면 덮어쓴다.

  2. 기존 파일에 내용 추가

    lint program.c | tee -a program.lint
    

    위와 동일하나, -a 옵션으로 인해 기존 파일에 내용을 덮어쓰지 않고 추가한다.

  3. sudo와 함께 사용하여 권한 문제 우회

    cat ~/.ssh/id_rsa.pub | ssh admin@server "sudo tee -a /root/.ssh/authorized_keys2 > /dev/null"
    

    sudo는 파이프를 통해 표준 출력을 파일로 직접 전달할 수 없는 제한이 있다. tee 명령어를 사용하여 이 제한을 우회하고, /dev/null로 출력을 보내 화면 표시를 생략한다.

  4. 프로세스 치환(process substitution)을 통한 필터링

    ls --color=always | tee >(sed "s/\x1b[^m]*m//g" > ls.txt)
    

    화면에는 컬러 출력을 유지하면서 파일에는 ANSI 이스케이프 코드를 제거한 내용을 저장한다.

4DOS / 4NT 구문

TEE [/A] 파일...
  • /A: 파일에 내용을 추가

PowerShell 구문

PowerShell에서는 Tee-Object cmdlet으로 구현되어 있으며, tee는 이 cmdlet을 호출하는 읽기 전용 별칭(alias)이다.

tee [-FilePath] <String> [-InputObject <PSObject>]
tee -Variable <String> [-InputObject <PSObject>]
  • -FilePath: 객체를 저장할 파일 경로
  • -Variable: 입력 객체를 할당할 변수 이름

PowerShell은 이진 데이터 및 원시 데이터 처리에는 적합하지 않으며, 스트림을 텍스트로 처리하고 전송 중 데이터를 변환할 수 있다.

동작 방식

tee 명령어는 표준 입력으로 전달된 데이터를 읽어, 지정된 모든 파일에 동시에 쓰는 동시에 표준 출력에도 동일한 데이터를 전달한다. 만약 어떤 파일에 대한 쓰기가 실패하더라도 다른 파일과 표준 출력에 대한 쓰기는 계속 진행되지만, 종료 상태(exit status)는 0보다 큰 값(실패)을 반환한다.

유사 명령어

  • sponge: tee와 유사한 기능을 제공하는 명령어로, 입력을 모두 읽은 후에야 출력 파일에 기록한다는 차이점이 있다.

참고 사항

  • GNU Core Utilities의 일부로 포함되어 있다.
  • Single UNIX Specification (POSIX)에 정의된 표준 명령어이다.
  • C 언어로 작성되었다.
둘러보기

더 찾아볼 만한 주제

    전체 문서 보기