명령 결과를 >로 파일에 저장했는데 화면에는 오류 메시지가 그대로 남는다. 저장이 실패한 것처럼 보이지만 정상 결과와 오류는 처음부터 다른 통로로 나간다. 셸에서 표준 출력(stdout)은 번호 1, 표준 오류(stderr)는 번호 2다. 두 통로를 구분하면 로그 파일에 무엇이 들어갔는지 정확히 알 수 있다.
>는 어떤 출력을 파일로 보낼까?
도식의 파란 경로 1과 주황 경로 2는 독립적으로 목적지를 정할 수 있다. >만 쓰면 기본적으로 표준 출력만 파일로 가고, 표준 오류는 2>처럼 별도로 지정해야 한다.
다음은 정상 문장 하나와 오류 문장 하나를 내보내는 독립 예제다. printf의 >&2는 오류 통로로 보낸다는 뜻이다.
{ printf '정상 결과\n'; printf '오류 안내\n' >&2; } > result.txtresult.txt에는 정상 결과만 들어가고, 오류 안내는 터미널에 보인다. >가 기본적으로 표준 출력 1을 파일로 바꾸기 때문이다. 중요한 기존 파일에 같은 명령을 다시 실행하면 >가 내용을 덮어쓸 수 있으니, 테스트에는 새 파일명을 사용한다. 이어 붙이려면 >>가 필요하지만 이 경우도 어떤 출력 통로를 저장하는지부터 확인해야 한다.
stderr까지 분리하려면 2>를 쓴다
오류를 따로 보관하고 싶다면 두 통로의 목적지를 각각 정한다.
{ printf '정상 결과\n'; printf '오류 안내\n' >&2; } \
> result.txt 2> error.txt이제 result.txt에는 정상 문장, error.txt에는 오류 문장이 있다. 2>의 2가 표준 오류를 가리킨다. 두 파일을 하나로 모으는 문법도 있지만, 오류를 숨기거나 섞으면 원인 파악이 어려워지는 경우가 있다. 처음에는 분리해서 확인하는 편이 안전하다.
명령이 실패했는지는 출력 위치만으로 판단하지 않는다. 종료 상태도 확인해야 한다. 오류 문구를 출력하면서 종료 상태 0을 반환하는 프로그램도 있을 수 있고, 반대로 출력이 거의 없는데 0이 아닌 상태로 끝날 수도 있다. 자동화 스크립트에서 화면이 조용하다는 이유만으로 성공이라고 판단하면 안 된다.
파일이 비거나 오류가 안 보일 때 점검할 것
명령 자체가 어느 통로로 메시지를 내보내는지 작은 예제로 먼저 확인한다. 이어서 리다이렉션 기호가 적용된 범위가 명령 하나인지, 중괄호로 묶인 여러 명령인지 본다. 파이프를 함께 쓰는 경우에도 다음 명령에 전달되는 기본 통로는 표준 출력이므로, 오류가 따로 보이는 것은 이상한 현상이 아니다.
로그를 무조건 버리는 2>/dev/null은 조사 중에는 신중히 사용한다. 운영 자동화에서는 오류를 버리기보다 적절한 로그 접근 권한과 보관 기간을 정하는 편이 낫다. 오류 문자열에 비밀값이 섞일 수 있으므로 공유·업로드 전에 내용을 확인하는 것도 중요하다.
핵심 요약: 정상 결과 1, 오류 2를 나눠 읽는다
>는 기본적으로 stdout을, 2>는 stderr를 보낸다. 화면의 오류가 파일에 없다고 해서 명령 전체가 저장되지 않은 것은 아니다. 각 통로의 파일 내용과 종료 상태를 함께 확인하면 실패 위치를 더 빨리 찾을 수 있다.
작성자
기초 개념을 구현과 검증, 실제 운영 판단까지 연결해 기록합니다.

