TTY는 Unix/Linux에서 문자 입출력과 터미널 제어를 제공하는 장치 인터페이스다. 터미널 창을 띄우면 보통 물리적인 타자기 대신 PTY(의사 터미널)를 사용한다. 화면을 그리는 터미널 에뮬레이터와 명령을 해석하는 셸은 서로 다른 프로그램이다.

이 글에서는 이름의 유래보다 먼저, 현재 시스템에서 무엇을 확인할 수 있는지 살펴본다.

터미널, 셸, TTY, PTY의 차이

용어 역할 예시
터미널 에뮬레이터 창에 문자를 표시하고 키 입력을 전달하는 프로그램 macOS Terminal, 여러 Linux 터미널 앱
셸 명령을 해석하고 프로세스를 실행하는 프로그램 bash, zsh
TTY 문자 입출력과 제어 기능을 제공하는 터미널 장치 인터페이스 Linux 가상 콘솔, 직렬 터미널, PTY의 slave
PTY master와 slave가 연결된 의사 터미널 쌍 Linux의 /dev/pts/N
제어 터미널 세션에 연결되어 작업 제어 등에 쓰이는 터미널 세션의 제어 터미널을 가리키는 /dev/tty

프로그램의 표준 입력이 반드시 제어 터미널인 것은 아니다. 파일이나 파이프를 표준 입력으로 받을 수도 있으며, 제어 터미널이 없는 세션도 있다. Linux의 TTY 하위 시스템은 커널 문서에 설명되어 있다.

입력이 프로그램에 도달하는 과정

터미널 에뮬레이터는 PTY의 master 쪽을 사용하고, 셸과 그 아래에서 실행되는 프로그램은 slave 쪽을 터미널처럼 사용한다. 셸이 명령을 실행하는 일과 커널이 터미널 설정을 처리하는 일을 구분하면 이해하기 쉽다.

키 입력 → 터미널 에뮬레이터 → PTY master ↔ PTY slave → 셸/프로그램
화면 출력 ← 터미널 에뮬레이터 ← PTY master ↔ PTY slave ← 셸/프로그램

터미널 설정에 따라 입력을 한 줄씩 전달하거나 입력 문자를 화면에 되돌려 표시할 수 있다. 일반적인 설정에서는 Ctrl-C가 인터럽트 문자로 해석되어 포그라운드 프로세스 그룹에 SIGINT가 전달된다. raw 모드 등에서는 같은 키가 다르게 처리될 수 있다. PTY의 구조와 동작은 Linux pty(7)를 참고한다.

tty로 표준 입력 확인하기

터미널 창에서 다음 명령을 실행한다.

tty

GNU tty는 표준 입력에 연결된 터미널의 파일 이름을 출력한다. 따라서 모든 출력 장치나 제어 터미널을 나열하는 명령이 아니다. 환경에 따라 /dev/pts/0(Linux) 또는 /dev/ttys000(macOS) 같은 결과가 나온다. 번호는 실행 환경마다 달라진다.

printf 'hello\n' | tty

이 명령의 표준 입력은 파이프다. 터미널 창 안에서 실행하더라도 not a tty가 출력되고 종료 상태는 1이다. 이번 확인에서도 macOS에서 같은 결과를 확인했다. 명령의 정확한 의미와 종료 상태는 GNU Coreutils의 tty 문서에 정리되어 있다.

Python으로 PTY 쌍 만들기

다음은 Unix 계열 환경에서 실행하는 작은 예제다. 사용 후 파일 디스크립터를 닫는다.

import os
import pty

master, slave = pty.openpty()
try:
    print(os.ttyname(slave))
    print(os.isatty(slave))
finally:
    os.close(master)
    os.close(slave)

2026-09-28 macOS에서 실행해 다음 결과를 확인했다.

/dev/ttys000
True

경로는 고정값이 아니다. Linux에서는 보통 /dev/pts/N 형태가 된다. isatty가 True라는 결과는 해당 파일 디스크립터가 터미널에 연결되었다는 뜻이다. 이 예제는 PTY 생성만 보여 주며, 셸을 실행하거나 현재 세션의 제어 터미널을 설정하지 않는다. pty.openpty()의 반환값과 플랫폼 제한은 Python 공식 pty 문서를 참고한다.

stty와 터미널 설정

stty -a

현재 터미널의 입력·출력 설정을 확인한다. 예를 들어 echo는 입력한 문자를 되돌려 표시하는 설정이고, icanon은 줄 단위 입력 처리와 관련된다. 일반 실행 시 표준 입력이 터미널이어야 한다. 설정을 바꾸는 명령을 복사하기 전에, 대상 터미널과 변경할 항목을 확인한다. GNU stty 문서에서 각 옵션을 확인할 수 있다.

왜 이름이 TTY인가?

TTY는 Teletypewriter에서 유래한 이름이다. 화면 대신 종이에 문자를 인쇄하던 전신 타자기가 컴퓨터의 입출력 장치로 사용되었고, 오늘날에는 터미널 장치의 이름으로 남아 있다.

Teletypewriter

이미지 출처: Nightflyer, Wikimedia Commons의 Teletypewriter 사진.

현재 터미널 창에서 사용하는 PTY는 그 물리 장치를 흉내 내는 소프트웨어 인터페이스다. 이름의 역사를 이해하는 것도 도움이 되지만, 문제를 해결할 때는 어떤 파일 디스크립터가 어떤 장치에 연결되어 있는지를 먼저 확인하는 편이 유용하다.

정리

터미널 에뮬레이터는 화면과 키보드를 다루고, 셸은 명령을 실행하며, TTY/PTY는 프로세스가 사용하는 터미널 입출력 인터페이스를 제공한다. tty의 결과가 예상과 다르면 표준 입력이 파일이나 파이프로 바뀌었는지 확인한다.