표준 출력과 표준 에러를 단일 파일로 리다이렉션하기
이 단계에서는 표준 출력과 표준 에러를 포함한 명령어의 모든 출력을 하나의 파일로 캡처하는 방법을 배웁니다. 이는 발생한 에러를 포함하여 스크립트나 명령어의 실행 전체 기록을 남기고 싶을 때 특히 유용합니다.
stdout과 stderr를 모두 생성하는 명령어를 사용해 보겠습니다. 존재하는 파일 (/etc/passwd) 과 존재하지 않는 파일 (non_existent_file) 을 동시에 나열해 봅니다.
ls -l /etc/passwd non_existent_file
터미널에 두 종류의 출력이 표시됩니다. 첫 번째 줄은 표준 에러이고, 두 번째 줄은 표준 출력입니다.
ls: cannot access 'non_existent_file': No such file or directory
-rw-r--r-- 1 root root 1916 Jul 18 2024 /etc/passwd
stdout을 위해 >만 사용하여 리다이렉션을 시도하면 에러 메시지는 여전히 화면에 나타납니다.
ls -l /etc/passwd non_existent_file > output_only.txt
터미널 출력:
ls: cannot access 'non_existent_file': No such file or directory
그리고 output_only.txt에는 표준 출력 내용만 담기게 됩니다.
cat output_only.txt
-rw-r--r-- 1 root root 1916 Jul 18 2024 /etc/passwd
두 스트림을 모두 하나의 파일로 리다이렉션하려면 &> 연산자를 사용할 수 있습니다. 이는 stdout(파일 디스크립터 1) 과 stderr(파일 디스크립터 2) 를 모두 지정된 파일로 보내는 편리한 약식 표현입니다.
한번 해보겠습니다. 모든 출력을 combined.log라는 파일로 리다이렉션합니다.
ls -l /etc/passwd non_existent_file &> combined.log
이번에는 터미널에 아무것도 출력되지 않습니다. 모든 출력이 combined.log에 캡처되었습니다. 내용을 확인해 보겠습니다.
cat combined.log
파일에 표준 출력과 표준 에러가 모두 포함되어 있는 것을 볼 수 있습니다.
ls: cannot access 'non_existent_file': No such file or directory
-rw-r--r-- 1 root root 1916 Jul 18 2024 /etc/passwd
동일한 결과를 얻기 위한 좀 더 전통적이고 약간 복잡한 구문도 있습니다: > file 2>&1. 이를 분석해 보면 다음과 같습니다.
> file: 표준 출력 (파일 디스크립터 1) 을 file로 리다이렉션합니다.
2>&1: 표준 에러 (파일 디스크립터 2) 를 표준 출력 (파일 디스크립터 1) 이 가는 곳과 동일한 위치로 리다이렉션합니다. stdout이 이미 file로 가고 있으므로, stderr도 그곳으로 보내집니다.
이 방법을 사용하여 출력을 combined_traditional.log에 저장해 보겠습니다.
ls -l /etc/passwd non_existent_file > combined_traditional.log 2>&1
마찬가지로 터미널에는 아무것도 나타나지 않습니다. 파일을 확인하면 동일한 결과가 나옵니다.
cat combined_traditional.log
ls: cannot access 'non_existent_file': No such file or directory
-rw-r--r-- 1 root root 1916 Jul 18 2024 /etc/passwd
&>가 더 짧고 선호되지만, 오래된 스크립트에서는 2>&1 형식을 자주 보게 되므로 이것이 무엇을 의미하는지 이해하는 것이 중요합니다. 두 스트림을 모두 추가 (append) 하려면 &>> 또는 >> file 2>&1을 사용하면 됩니다.