본문 바로가기
C.W.K.
Stream
Lesson 01 of 10 · published

표준 스트림: stdin, stdout, stderr

~12 min · stdin, stdout, stderr, fd

Level 0창 구경꾼
0 XP0/95 lessons0/14 achievements
0/100 XP to next level100 XP to go0% complete

모든 프로그램에 열리는 세 가지 통로

Unix 프로세스는 시작할 때 세 개의 파일 디스크립터를 받아. stdin(0)은 입력, stdout(1)은 결과, stderr(2)는 오류와 진단을 내보내는 통로야. 셸의 파이프와 리디렉션은 이 통로가 어디를 가리키는지 바꾸는 기능이야.

처음 연결되는 곳

  • stdin (0): 보통 키보드에서 읽어.
  • stdout (1): 보통 터미널 화면에 결과를 써.
  • stderr (2): 화면에 보이지만 stdout과 분리돼 있어. 오류 메시지가 다음 명령으로 넘길 데이터에 섞이지 않게 해.

왜 출력 통로가 둘일까?

find / -name foo 2>/dev/null | grep bar에서 권한 오류는 stderr로 나가 버려지고, 실제 검색 결과만 stdout을 따라 grep으로 들어가. 출력 통로가 하나뿐이라면 진단과 데이터를 따로 처리할 수 없어.

파일 디스크립터 번호로 연결하기

2>는 stderr, 1>는 stdout을 뜻해. 2>&1은 stderr가 현재 stdout과 같은 목적지를 가리키게 해. 필요하면 exec 3> file로 3번 디스크립터를 열고 printf 'hello\n' >&3처럼 별도 출력 통로를 만들 수도 있어.

스트림은 형식이 아니라 통로야

stdin, stdout, stderr는 바이트가 흐르는 경로일 뿐 UTF-8이나 줄 단위 텍스트를 보장하지 않아. 다음 명령이 특정 형식을 기대한다면 앞 명령이 그 계약을 실제로 내보내는지 확인해야 해. 바이너리를 텍스트 도구로 넘기면 조용히 손상될 수 있어.

표준 오류를 분리하면 조합하기 쉬워

결과 데이터는 stdout으로, 진행 상황과 진단은 stderr로 보내. 그러면 호출자는 결과만 파일에 저장하거나 다음 명령으로 넘길 수 있어. 직접 만든 스크립트도 이 약속을 지켜야 파이프라인에서 안전하게 재사용할 수 있어. 결과와 진단을 한 통로에 섞으면 호출자가 문자열을 다시 해석해야 하고, 그 순간 조합 가능한 인터페이스가 사람 눈에만 맞는 출력으로 퇴보해.

Code

세 스트림 직접 보기·bash
# 표준 출력과 표준 오류는 기본적으로 모두 화면에 보임
echo 'hello'                    # 표준 출력
ls /no/such/dir                 # 표준 오류만
# 표준 오류 숨기기
ls /no/such/dir 2>/dev/null
# 표준 출력만 숨기고 표준 오류는 유지
ls /etc 1>/dev/null
# 표준 오류를 표준 출력에 합쳐 함께 파이프로 전달
ls /etc /no/such/dir 2>&1 | head

External links

Exercise

ls /etc /no/such/dir을 실행해 정상 출력과 오류가 같은 화면에 나타나는지 봐. 이어서 ls /etc /no/such/dir > out.txt 2> err.txt로 두 스트림을 분리하고, 각 파일에 의도한 내용만 들어갔는지 읽어 확인해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.