명령 행 응용 프로그램에서 표준 오류 스트림을 사용해야하는 경우 여부 stdout또는 stderr사용자가 불법 인수로 프로그램을

명령 줄 응용 프로그램을 작성할 때 오류를 사용할 때 지침이 있습니까? 놀랍게도 인터넷 검색을 할 때 아무것도 찾지 못했습니다.

특히, 내가 지금 걱정하고있는 질문은 사용 여부 stdout또는 stderr사용자가 불법 인수로 프로그램을 호출했을 때입니다. 그러나 더 포괄적 인 답변은 사용자가 기대하는 방식으로 작동하는 프로그램을 작성하는 데 명확한 규칙이 필요한 유일한 사례는 아니기 때문에 매우 감사합니다.



답변

예, stderr잘못된 인수가 사용될 때 메시지를 표시하십시오 . 그리고 이로 인해 응용 프로그램이 종료되면 0이 아닌 종료 상태로 종료하십시오.

진단 메시지 또는 사용자 상호 작용에 표준 오류 스트림을 사용해야합니다 . 진단 메시지에는 오류 메시지, 경고 및 유틸리티가 올바로 작동 할 때 유틸리티 출력에 포함되지 않은 기타 메시지가 포함됩니다 ( “올바르게”는 파일을 찾을 수없는 등의 예외적 인 일이 없음을 의미합니다).

많은 쉘 (모두?)은 프롬프트, 사용자 유형 및 메뉴 등을 표시 stderr하므로 리디렉션 stdout을 통해 쉘과 의미있는 방식으로 상호 작용하는 것을 막을 수 있습니다.

다음은 이 주제에 대한 블로그 게시물 입니다.

유닉스 파이프의 발명가 인 Doug McIllroy가 인용 한 내용입니다 stderr. ‘v6’은 1975 년에 릴리스 된 원래 Unix 운영 체제의 특정 버전 버전을 나타냅니다.

모든 프로그램은 표준 출력에 진단을 배치했습니다. 이로 인해 출력이 파일로 경로 재 지정 될 때 항상 문제가 발생했지만 출력이 의심되지 않은 프로세스로 전송 될 때 참을 수 없게되었습니다. 그럼에도 불구하고 표준 입력 표준 출력 모델의 단순성을 위반하지 않으려는 사람들은 v6을 통해 이러한 상황을 용인했습니다. 그 직후 Dennis Ritchie는 표준 오류 파일을 도입하여 Gordian 매듭을 끊었습니다. 충분하지 않았습니다. 파이프 라인을 사용하면 동시에 실행중인 여러 프로그램에서 진단을 수행 할 수 있습니다. 자신을 식별하기 위해 진단이 필요했습니다.

-Doug McIllroy, “연구용 UNIX 독자 : 1971-1986 년 프로그래머 매뉴얼의 주석 발췌”

“자신을 식별”한다는 것은 단순히 “이봐! 나 이야기 중이 야! 이것은 잘못되었다 : […]”:

$ ls nothere
ls: nothere: No such file or directory

stderr그렇지 않으면 무엇을 읽고 있든 읽을 수 있기 때문에 이것을 사용하는 것이 바람직합니다 stdout(그러나 우리는 ls어쨌든 그렇게하지 않습니까?).


답변

에서 POSIX 사양 표준 스트림 :

프로그램 시작시 표준 입력 (일반 입력 읽기), 표준 출력 (일반 출력 쓰기) 및 표준 오류 (진단 출력 쓰기 )의 세 가지 스트림을 미리 정의해야하며 명시 적으로 열 필요는 없습니다 .

즉, 오류, 디버깅 정보 및 진단 범주에 해당되는 모든 항목이로 들어갑니다 stderr.

자세한 정보는 관련 질문을 참조하십시오. 진행률 보고서 / 로깅 정보가 stderr 또는 stdout에 있습니까?