파이프가 기본으론 안 옮기는 스트림
파이프는 stdout 만 옮겨. 에러는 그 뒤에 | 가 몇 개 있든 화면으로 가. 에러를 잡거나 숨기거나 파이프 태우려면 stderr 를 명시적으로 redirect.
평생 쓸 세 패턴
cmd 2> err.log— stderr 를 파일로.cmd 2>/dev/null— stderr 묵음.cmd 2>&1— stderr 를 stdout 에 합침.
조합: cmd 2>&1 | grep ERROR 가 두 스트림 모두에서 에러 검색. cmd > out.log 2>&1 는 전부 한 파일로.
순서 중요
Redirection 은 왼쪽부터 처리, 각 &1 은 '지금 fd 1 이 가리키는 곳' 을 의미. 비교:
cmd > out.log 2>&1→ stdout 을 파일로, 그 다음 stderr 도 stdout 의 현재 목적지 (= 파일) 로. 둘 다 out.log.cmd 2>&1 > out.log→ stderr 가 stdout 의 현재 목적지 (= 화면) 로 가고 그 후에 stdout 만 파일로. 에러는 화면에 남음!
Bash 4+ 단축 &>
cmd &> out.log 가 둘 다. cmd &>> out.log 은 append. 분리 필요 없으면 > out.log 2>&1 보다 깔끔. POSIX sh 엔 없어 — 휴대성 있는 스크립트엔 long form.