쉘 스크립트에서 stderr로 리디렉션을 사용하는 경우

쉘 스크립트에서 stderr로 리디렉션을 사용하는 경우

나는 다음과 같이 잘 작동하는 유틸리티를 알고 있습니다.grep"정상" 메시지를 stdout으로 출력하고 오류 메시지를 stderr로 출력합니다.

$ grep '^foo' file1 file2
file1:foo
grep: file2: No such file or directory

쉘 스크립트를 직접 작성할 때 어떤 출력과 어떤 메시지가 stderr에 표시되어야 하는지 또는 귀찮게 해야 할지 결정하기 어려운 경우가 종종 있습니다.

모범 사례에 대해 궁금합니다. 특정 메시지를 stderr로 리디렉션하는 것이 언제 필요하고 합리적이며, 언제 그렇지 않습니까?

물론 "상황에 따라 다릅니다". 하지만 이러한 결정을 내리는 데 도움이 될 수 있는 통찰력이 있습니까?

이 주관적인 질문을 형식으로 유지하기 위해 저는 경험과 가능하다면 사실에 기초한 '왜'에 대한 답변을 장려하고 싶습니다.

답변1

쉘 스크립트를 직접 작성할 때 어떤 출력과 어떤 메시지가 stderr에 표시되어야 하는지 또는 귀찮게 해야 할지 결정하기 어려운 경우가 종종 있습니다.

침묵은 금이다. 모든 것이 정상이면 아무것도 출력되지 않습니다.

모범 사례에 대해 궁금합니다. 특정 메시지를 stderr로 리디렉션하는 것이 언제 필요하고 합리적이며, 언제 그렇지 않습니까?

stderr을 stdout에서 분리하는 가장 쉬운 방법: 모든 스크립트 출력이 파이프를 통해 다른 명령으로 리디렉션된다고 상상해 보세요. 이 경우 stdout의 예기치 않은 정보가 파이프라인 순서를 깨뜨릴 수 있으므로 모든 알림을 stderr에 유지해야 합니다.

때로는 다음과 같이 파이프라인에도 나타납니다.

command1 | while read line ; do command2 ; done | command3

command2사용자 출력에 무언가를 전달해야 합니다 . 임시 파일이 없는 가장 쉬운 방법은 stderr입니다.

답변2

stderr나는 일반적으로 데이터용으로 예약된 애플리케이션 작업 과 관련된 모든 것을 작성합니다 stdout.

이것을 사용하여 입력을 읽고 파이프를 통해 다른 애플리케이션에 전달할 때 출력이 상태 메시지로 가득 차는 것을 cat원하지 않습니다.

다른 응용 프로그램이나 내 응용 프로그램의 후처리 프로세서에 관심이 있을 수 있는 모든 항목이 제거되고 stdout내 응용 프로그램과 내부적으로만 관련된 모든 항목이 제거됩니다 stderr.

답변3

개인적으로 선호하는 것은 stderr정보 메시지뿐만 아니라 오류 메시지와 예외도 에 보내는 것 입니다 stdout. IMO에서는 stderr모든 예외가 적용되므로 이것이 내 규칙입니다.

관련 정보