표준 오류 리디렉션 및 스트림 결합
이 단계에서는 표준 오류 (stderr) 를 리디렉션하는 방법과 stdout 및 stderr을 단일 스트림으로 결합하는 방법을 배우게 됩니다. 이는 명령에서 생성된 오류 메시지를 관리하는 데 매우 중요하며, 필요에 따라 오류 메시지를 로깅하거나 폐기할 수 있도록 해줍니다.
stderr은 파일 디스크립터 2임을 기억하십시오. 2>를 사용하여 오류 메시지를 리디렉션합니다.
표준 오류를 파일로 리디렉션하기
때로는 명령이 표준 출력과 별도로 캡처하려는 오류 메시지를 생성합니다.
-
~/project 디렉토리에 있는지 확인합니다.
cd ~/project
[labex@host project]$
-
존재하지 않는 디렉토리의 내용을 나열해 보겠습니다. 이렇게 하면 오류 메시지가 생성됩니다.
ls non_existent_directory
ls: cannot access 'non_existent_directory': No such file or directory
터미널에 직접 출력된 오류 메시지를 볼 수 있습니다.
-
이제 이 오류 메시지를 errors.log라는 파일로 리디렉션해 보겠습니다.
ls non_existent_directory 2> errors.log
이번에는 터미널에서 오류 메시지가 표시되지 않습니다.
-
errors.log의 내용을 확인합니다.
cat errors.log
ls: cannot access 'non_existent_directory': No such file or directory
오류 메시지가 이제 파일에 저장됩니다.
표준 오류 폐기하기
종종, 신경 쓰지 않는 시끄러운 오류 메시지를 생성하는 명령을 실행해야 할 수 있습니다. 이러한 경우 stderr을 /dev/null로 리디렉션할 수 있습니다. /dev/null은 모든 데이터를 폐기하는 특수 장치 파일입니다.
-
존재하지 않는 디렉토리를 사용하여 ls 명령을 다시 시도하지만 이번에는 오류를 폐기합니다.
ls non_existent_directory 2> /dev/null
터미널에 출력이 표시되지 않으며, 오류 메시지가 파일에 저장되지 않습니다.
표준 출력 및 표준 오류 결합
stdout과 stderr을 동일한 파일에 캡처하려는 경우가 있습니다. 이는 몇 가지 방법으로 수행할 수 있습니다.
방법 1: > file 2>&1
이 방법은 stdout을 파일로 리디렉션한 다음 stderr을 stdout과 동일한 위치로 리디렉션합니다. 순서 2>&1이 중요합니다. 이는 "파일 디스크립터 2(stderr) 를 파일 디스크립터 1(stdout) 과 동일한 위치로 리디렉션"을 의미합니다.
-
표준 출력과 표준 오류를 모두 생성하는 명령을 만들어 보겠습니다. find를 사용하여 권한이 있는 디렉토리와 권한이 없는 디렉토리에서 파일을 검색합니다.
find ~/project /root -name "current_datetime.txt" > combined_output.log 2>&1
여기서 find ~/project -name "current_datetime.txt"는 stdout(찾은 경우) 을 생성하고, find /root -name "current_datetime.txt"는 권한 문제로 인해 stderr을 생성할 가능성이 높습니다.
-
combined_output.log 파일을 검사합니다.
cat combined_output.log
/home/labex/project/current_datetime.txt
find: ‘/root’: Permission denied
성공적인 출력 (파일 경로) 과 오류 메시지가 모두 동일한 파일에 캡처된 것을 볼 수 있습니다.
방법 2: &> file (Bash 전용)
Bash 는 stdout과 stderr을 파일로 결합하기 위한 단축키 &>를 제공합니다. 이는 > file 2>&1과 동일합니다.
-
&> 단축키를 사용하여 동일한 find 명령을 시도해 보겠습니다.
find ~/project /root -name "file_list.txt" &> combined_output_shorthand.log
-
combined_output_shorthand.log의 내용을 확인합니다.
cat combined_output_shorthand.log
/home/labex/project/file_list.txt
find: ‘/root’: Permission denied
결과는 이전 방법과 동일하며, &>의 편리함을 보여줍니다.
결합된 스트림 추가
stdout과 마찬가지로 >> file 2>&1 또는 &>> file을 사용하여 결합된 stdout과 stderr을 파일에 추가할 수 있습니다.
-
combined_output.log에 더 많은 출력과 오류를 추가합니다.
find ~/project /root -name "line_count.txt" >> combined_output.log 2>&1
-
업데이트된 combined_output.log를 봅니다.
cat combined_output.log
/home/labex/project/current_datetime.txt
find: ‘/root’: Permission denied
/home/labex/project/line_count.txt
find: ‘/root’: Permission denied
새로운 출력과 오류가 기존 내용에 추가됩니다.
이제 표준 오류를 리디렉션하는 방법과 표준 출력 및 표준 오류를 단일 파일로 결합하는 방법을 성공적으로 배웠습니다. 이 지식은 강력한 스크립팅 및 시스템 관리 작업에 필수적입니다.