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


15

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

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

쉘 스크립트를 직접 작성할 때 종종 stderr에 어떤 출력과 어떤 메시지를 표시해야하는지 또는 전혀 신경 써야하는지 결정하기가 어려워집니다.

모범 사례에 대해 알고 싶습니다. stderr로 일부 메시지를 리디렉션 할 때는 언제 합당하고 합당하지 않은지?

"그것은 달려있다", 그러나 당신은 내가 이러한 결정을 내리는 데 도움이 될 몇 가지 통찰력을 가지고 있습니까?

이 주관적인 질문이 형식에 맞도록하기 위해 나는 "이유"를 해결하고 경험에 의해 그리고 가능한 경우 사실에 의해 뒷받침되는 답변을 장려하고 싶습니다.


@rush가 완벽하게 설명합니다. 나는 보통 긴 스크립트를 위해 진행 보고서를 stderr에 인쇄합니다.
terdon

답변:


12

쉘 스크립트를 직접 작성할 때 종종 stderr에 어떤 출력과 어떤 메시지를 표시해야하는지 또는 전혀 신경 써야하는지 결정하기가 어려워집니다.

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

모범 사례에 대해 알고 싶습니다. stderr로 일부 메시지를 리디렉션 할 때는 언제 합당하고 합당하지 않은지?

stderr과 stdout을 분리하는 가장 쉬운 방법 : 모든 스크립트 출력이 파이프를 통해 다른 명령으로 리디렉션된다고 상상해보십시오. 이 경우 stdout의 예기치 않은 정보로 인해 파이프 시퀀스가 ​​중단 될 수 있으므로 모든 알림을 stderr에 보관해야합니다.

또한 때때로 이와 같은 파이프에서 :

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

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


"파이프 상상하기"아이디어에 감사드립니다. 때로는 "알림"만하는 스크립트를 배포하기도합니다 ( echo일부 변수, 수행 한 작업 표시, 진행률 표시). 이 로깅 메시지가 모든 스크립트에서 출력되므로 모든 것을 stderr에 배치하는 것을 망설입니다. 이러한 상황에서 파이프 아이디어를 적용하는 방법을 잘 모르겠습니다.
glts

1
@glts 프로그램은 항상 수정되고 향상됩니다. 언급 한 스크립트는 현재 데이터를 출력하지 않지만 나중에 또는 다른 스크립트의 시작점으로 사용할 수 있습니다. 컨벤션에 따라 시작하면 나중에 훨씬 덜 놀라게 될 것입니다. OTOH, 출력을 파일로 저장하려면 stderr를 리디렉션해야하므로 다른 모든 것과 같은 절충안입니다.
Joe

+1 또 다른 문구 : stdout을 항상 기계 판독 가능하게하거나 최소한 유용한 텍스트 데이터를 일관된 형식으로 포함해야합니다.
tripleee

2

응용 프로그램 작업에 관한 I 일반적으로 쓰기 모든 것을하는 stderr, stdout데이터 용으로 예약되어 있습니다.

같은 응용 프로그램을 상상해보십시오 cat. 입력을 사용하여 파이프를 통해 입력을 읽고 다른 응용 프로그램으로 전달할 때 출력에 상태 메시지가 표시되는 것을 원하지 않습니다.

다른 응용 프로그램이나 내 응용 프로그램의 포스트 프로세서에 흥미로울 수있는 모든 것 stdout, 내 응용 프로그램의 내부에만 관련된 모든 것입니다 stderr.


0

개인적으로 선호하는 것은 (으)로 오류 메시지 및 예외 stderr및 정보 메시지를 보내는 것 stdout입니다. IMO stderr는 예외이며 따라서 제 협약입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.