명령줄에서 실행되도록 설계된 일부 Python 스크립트를 리팩토링하고 있습니다. 이러한 스크립트는 로깅을 사용하므로 일부 메시지가 STDERR에 기록됩니다. Linux의 프로그램이 STDERR로 출력하지만 여전히 0(성공) 종료 상태를 반환하는 것이 적절한지 궁금합니다. 종료 상태가 0이 아닌 경우에만 STDERR을 참조해야 한다고 생각합니다.
PS 기본적으로 스크립트의 출력을 캡처하여 종료 상태와 함께 처리를 위해 다른 서비스로 보내야 합니다. 데이터가 일관적이기를 바랍니다.
답변1
예, 프로그램은 표준 오류로 출력하고 여전히 0 종료 상태를 반환할 수 있습니다. 많은 POSIX 유틸리티 사양에 "표준 오류는 다음에만 적용됩니다.진단정보. "
STDERR로 출력하고 0을 반환하는 프로그램의 명확한 예는 다음과 같습니다.crontab
. 노력하다
EDITOR=nano crontab -e 2> stderr.out; echo $?
cron 파일을 수정하지 말고 편집기를 종료하십시오. 0
에코되지만 stderr.out
(내 경우에는) 다음과 같은 메시지가 표시됩니다.
no crontab for user - using an empty one
No modification made
답변2
stderr
파일 번호가 있는 미리 정의된 스트림입니다 2
. 관례는 중요하거나 대체 정보(반드시 오류는 아님)를 인쇄하는 것입니다.
curl
예를 들어, to에 의해 트리거된 메시지는 이미 실제 결과를 얻는 데 사용되었기 때문에 기본적으로 출력됩니다 . 따라서 종료 코드가 0이 되고 다음과 같이 출력됩니다.--verbose
stderr
stdout
stderr
$ curl ifconfig.me
$ curl --verbose ifconfig.me 2>messages.txt
반면에 종료 코드는 다음과 같습니다 sys.exit()
(참조:_출구(2)그리고출구(3)). 둘을 연결하는 규칙은 없습니다. 가져가다grep
예를 들어, 오류가 발생하면 로 출력되지만 stderr
종료 코드는 플래그에 따라 조정될 수 있습니다.
일반적으로 종료 상태는 행이 선택된 경우 0, 행이 선택되지 않은 경우 1, 오류가 발생한 경우 2입니다. 그러나 만일
-q
또는--quiet
또는--silent
행을 사용하고 선택하면 오류가 발생하더라도 종료 상태는 0입니다.
답변3
글쎄요, 저는 아직도 이 질문이 무엇을 묻고 있는지 잘 모르겠습니다. 그런데 이제 다시 오픈했으니 예전에 말씀드렸던 내용을 다시 올리겠습니다. 다른 사람(그리고 나)이 말한 내용을 반복할 위험이 있습니다.
- 프로그램이 stderr에 쓰고 여전히 상태 0으로 종료되는 것은 확실히 가능합니다. 이는 드문 일이지만 나쁜 습관으로 간주되지는 않습니다.
- 프로그램을 실행하는 것이 적절하고 안전한지 여부가 주요 관심사인 경우 N+1쇼가 끝난 후 질소(및 기타 선행 작업)이 이미 종료된 경우 종료 상태에만 기초하여 결정을 내려야 합니다.
- 주의를 끌기 위해 이상 현상을 에스컬레이션하고 싶지만 잘 문서화되지 않은 경우, 그 다음에stderr을 살펴봐야 합니다.