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

표준 오류 리디렉션: 2>, 2>&1, &>

~10 min · stderr, redirect, merge

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

파이프가 기본으로 옮기지 않는 스트림

파이프는 stdout만 다음 명령으로 보내. 뒤에 |가 몇 개 이어져도 stderr는 기본적으로 화면에 남아. 오류를 파일에 저장하거나 숨기거나 파이프에 넣으려면 stderr의 목적지를 명시적으로 바꿔야 해.

자주 쓰는 세 가지 형태

  • cmd 2> err.log: stderr를 파일에 써.
  • cmd 2>/dev/null: stderr를 버려.
  • cmd 2>&1: stderr가 stdout의 현재 목적지를 가리키게 해.

cmd 2>&1 | grep ERROR는 두 출력 스트림에서 ERROR를 찾고, cmd > out.log 2>&1는 두 스트림을 한 파일에 저장해.

리디렉션 순서가 결과를 바꿔

셸은 리디렉션을 왼쪽부터 적용하고 &1을 만난 순간의 1번 파일 디스크립터 목적지를 복제해.

  • cmd > out.log 2>&1: stdout을 파일로 바꾼 뒤 stderr도 같은 파일로 보내.
  • cmd 2>&1 > out.log: stderr는 원래 stdout인 화면을 계속 가리키고 stdout만 파일로 바뀌어.

Bash 4 이상의 &> 단축형

cmd &> out.log는 두 스트림을 파일에 쓰고, cmd &>> out.log는 파일 뒤에 이어 써. POSIX sh에서는 지원하지 않으므로 이식성이 필요한 스크립트에는 > out.log 2>&1 형태를 사용해.

파일 디스크립터 복제를 왼쪽부터 따라가

2>&1 >file>file 2>&1의 최종 화면만 상상하지 말고 각 단계에서 1번과 2번이 어디를 가리키는지 적어 봐. 복제가 일어난 뒤에 stdout 목적지를 바꿔도 먼저 복제된 stderr의 목적지는 자동으로 따라가지 않아.

두 스트림을 합치면 정보가 사라져

사람이 읽는 빌드 로그에서는 stdout과 stderr를 한 파일에 모으는 편이 편할 수 있어. 하지만 다음 파서는 결과 데이터와 오류를 다시 나눌 수 없어. 누가 출력을 소비하는지 보고 합칠 시점을 정해.

Code

흔한 stderr 처리·bash
# 권한 오류는 숨기고 검색
find / -name 'todo.md' 2>/dev/null
# 두 스트림을 로그 하나에 저장
./long_build.sh > build.log 2>&1
# 오류는 화면에 보고 표준 출력은 파일에 저장
./long_build.sh > build.log
# 표준 오류만 파일로 보내기
./long_build.sh 2> errors.log

External links

Exercise

ls /etc /no/such > out.log 2>&1을 실행해 정상 출력과 오류가 모두 파일로 갔는지 확인해. 다음에는 ls /etc /no/such 2>&1 > out.log를 실행해 오류는 화면에 남고 정상 출력만 파일로 가는 이유를 리디렉션이 적용되는 순서로 설명해 봐.

Progress

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

댓글 0

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

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