프로그램은 보통 정상 결과를 표준 출력에, 진단 메시지를 stderr로 줄여 쓰는 표준 오류라는 별도 스트림에 씁니다. 스트림을 분리하면 오류 메시지를 섞지 않고 유용한 데이터를 저장할 수 있습니다.
Text-Fu · 레슨 3
stderr (표준 오류)
Bash에서 표준 오류를 별도로 리디렉션하거나 표준 출력과 결합하는 방법을 배웁니다.
정상 출력과 오류 분리하기
존재하지 않는 경로를 지정한 명령어를 살펴보겠습니다.
$ ls /fake/directory > peanuts.txt
ls: cannot access '/fake/directory': No such file or directory
>는 stdout만 리디렉션합니다. 진단은 여전히 터미널에 연결된 stderr로 나갑니다. 한편 쉘은 ls에 정상 결과가 없어도 stdout용 peanuts.txt를 만들거나 잘라냅니다.
표준 스트림은 관례상 다음 파일 디스크립터를 사용합니다.
0: stdin (표준 입력)1: stdout (표준 출력)2: stderr (표준 오류)
ls /missing > results.txt의 오류가 보통 터미널에 남는 이유는 무엇인가요?
2>로 stderr 리디렉션하기
stderr를 파일로 리디렉션하려면 파일 디스크립터 2 뒤에 > 연산자를 사용합니다. 이 명령은 모든 오류 메시지를 지정된 stderr 파일로 보냅니다.
$ ls /fake/directory 2> errors.txt
쉘은 errors.txt를 만들거나 잘라내고 디스크립터 2에 연결합니다. stdout은 기존 목적지를 유지합니다. 오류 출력을 추가하려면 2>> errors.txt를 사용합니다.
stdout은 기존 목적지에 둔 채 find /restricted의 진단으로 errors.log를 교체하는 명령어는 무엇인가요?
stdout과 stderr 결합하기
정상 출력과 오류 메시지를 모두 동일한 파일에 캡처하고 싶다면 어떻게 해야 할까요? 두 스트림을 모두 리디렉션하여 이를 수행할 수 있습니다.
$ ls /fake/directory /etc/passwd > combined.txt 2>&1
이것을 분석해 보겠습니다.
> combined.txt는 stdout을 파일에 연결합니다.2>&1은stderr(파일 디스크립터 2) 를stdout(파일 디스크립터 1) 이 현재 가리키고 있는 위치로 리디렉션합니다.
리디렉션은 왼쪽에서 오른쪽으로 처리되므로 순서가 중요합니다. 순서를 뒤집으면 결과도 달라집니다.
$ ls /fake/directory /etc/passwd 2>&1 > regular.txt
여기서는 stderr가 먼저 stdout의 원래 터미널 목적지를 복제하고, 그 뒤 stdout만 regular.txt로 이동하므로 두 스트림이 다른 곳으로 갑니다.
command의 stdout과 stderr를 모두 all.log로 보내는 Bash 리디렉션은 무엇인가요?
stdout과 stderr를 모두 리디렉션하는 더 현대적이고 짧은 방법은 &>를 사용하는 것입니다.
$ ls /fake/directory /etc/passwd &> combined.txt
Bash에서 두 스트림을 추가하려면 &>>를 사용합니다. 명시적인 > file 2>&1 형식도 쉘 스크립트와 문서에 자주 나오므로 알아둘 가치가 있습니다.
build의 stdout과 stderr를 모두 build.log에 추가하는 Bash 명령어는 무엇인가요?
의도적으로 스트림 버리기
때로는 명령을 실행하고 잠재적인 오류 메시지를 완전히 무시하고 싶을 수 있습니다. 이 작업을 수행하려면 stderr를 /dev/null이라는 특수 파일로 리디렉션할 수 있으며, 이 파일은 기록되는 모든 데이터를 폐기합니다.
$ ls /fake/directory 2> /dev/null
이는 명령어를 성공하게 만들거나 종료 상태를 바꾸지 않고 진단 스트림만 숨깁니다. 문제 해결 중에는 필요한 정보를 버리지 말고 stderr를 보존하거나 표시하세요.
check-data 2> /dev/null은 무엇을 바꾸나요?
세 표준 스트림 관리는 다음 실습에서 연습해 보세요.
- Linux 에서 입력 및 출력 리디렉션 - 이 랩에서는 Linux 셸에서 입력 및 출력을 리디렉션하는 방법을 배웁니다. 표준 출력 (stdout), 표준 오류 (stderr) 및 표준 입력 (stdin) 을 제어하고 >, >>, 2> 및 tee 명령과 같은 연산자를 사용하여 데이터 흐름을 조작하는 방법을 연습합니다.
레슨 완료
stderr (표준 오류) 완료
이제 진단 메시지를 정상 출력과 분리하거나 함께 결합할 수 있습니다.
stderr가 파일 디스크립터 2임을 알 수 있습니다.
2>또는2>>로 오류 로그를 교체하거나 추가할 수 있습니다.여러 리디렉션을 왼쪽에서 오른쪽으로 적용할 수 있습니다.
두 출력 스트림을 의도한 구문으로 결합할 수 있습니다.
진단 손실을 감수할 수 있을 때만 버릴 수 있습니다.