명령이 오류를 생성할 때 어떤 일이 발생하는지 살펴보겠습니다. 존재하지 않는 디렉터리의 내용을 나열하고 출력을 peanuts.txt라는 파일로 리디렉션해 보세요.
ls /fake/directory > peanuts.txt
깔끔한 프롬프트 대신 화면에 오류 메시지가 표시됩니다.
ls: cannot access /fake/directory: No such file or directory
이 메시지가 파일로 전송되지 않은 이유가 궁금할 수 있습니다. 이는 표준 오류 (standard error), 즉 stderr라는 또 다른 I/O 스트림이 작용하기 때문입니다.
Linux 에서 표준 오류 (Standard Error) 란 무엇인가요?
Linux 에서 stderr는 프로그램이 오류 메시지와 진단 정보를 보내는 데 사용하는 기본 출력 스트림입니다. 이는 일반적인 프로그램 출력을 위해 사용되는 표준 출력 (stdout) 스트림과는 완전히 분리되어 있습니다. 기본적으로 stdout과 stderr 모두 출력을 터미널 화면으로 보내므로 오류 메시지가 직접 표시되는 것입니다.
stderr를 제어하려면 다른 리디렉션 방법이 필요합니다.
파일 디스크립터 이해하기
stdin, stdout, stderr와 같은 I/O 스트림을 관리하기 위해 시스템은 파일 디스크립터를 사용합니다. 파일 디스크립터는 커널이 열린 파일이나 스트림을 식별하는 데 사용하는 음이 아닌 정수입니다. 기본 파일 디스크립터는 다음과 같습니다.
0: stdin (표준 입력)1: stdout (표준 출력)2: stderr (표준 오류)
숫자 2는 전용 stderr 파일 디스크립터이며, 이를 사용하여 오류 메시지가 어디로 가는지 제어할 수 있습니다.
stderr 를 파일로 리디렉션하기
stderr를 파일로 리디렉션하려면 파일 디스크립터 2 뒤에 > 연산자를 사용합니다. 이 명령은 모든 오류 메시지를 지정된 stderr 파일로 보냅니다.
ls /fake/directory 2> peanuts.txt
이제 터미널은 조용해지고 오류 메시지는 peanuts.txt 파일 안에 있게 됩니다.
stdout 및 stderr 결합하기
정상 출력과 오류 메시지를 모두 동일한 파일에 캡처하고 싶다면 어떻게 해야 할까요? 두 스트림을 모두 리디렉션하여 이를 수행할 수 있습니다.
ls /fake/directory /etc/passwd > peanuts.txt 2>&1
이것을 분석해 보겠습니다.
> peanuts.txt는stdout(파일 디스크립터 1) 을peanuts.txt파일로 리디렉션합니다.2>&1은stderr(파일 디스크립터 2) 를stdout(파일 디스크립터 1) 이 현재 가리키고 있는 위치로 리디렉션합니다.
순서가 중요합니다. 2>&1은 stderr를 stdout의 현재 대상으로 보냅니다. 이 경우 stdout은 파일로 연결되어 있으므로 stderr도 해당 파일로 전송됩니다.
stdout과 stderr를 모두 리디렉션하는 더 현대적이고 짧은 방법은 &>를 사용하는 것입니다.
ls /fake/directory /etc/passwd &> peanuts.txt
오류 메시지 폐기하기
때로는 명령을 실행하고 잠재적인 오류 메시지를 완전히 무시하고 싶을 수 있습니다. 이 작업을 수행하려면 stderr를 /dev/null이라는 특수 파일로 리디렉션할 수 있으며, 이 파일은 기록되는 모든 데이터를 폐기합니다.
ls /fake/directory 2> /dev/null
이 명령은 실행되며 stderr의 모든 오류 출력은 /dev/null로 전송되어 폐기되므로 화면이 깨끗하게 유지됩니다.