명령 행 응용 프로그램에서 표준 오류 스트림을 사용해야하는 경우


9

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

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


이러한 오류 메시지가 일반 출력과 섞여도 괜찮습니까? 예를 들어 프로그램이 데이터 필터입니까?
— thrig

데이터 필터가 아닙니다. 또한 대화식이 아닙니다. 사용자는 인수 (파일 경로 중 하나)를 사용하여 호출하고 프로그램이 작동하고 해당 파일을 변경하며 몇 가지 메시지를 인쇄하며 이상적으로 오류 메시지를 인쇄하지 않고 종료합니다.
— UTF-8

답변:


15

예, 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어쨌든 그렇게하지 않습니까?).


따라서 응용 프로그램이 실행되는 동안 사용자에게 무언가를 물을 때 stderr에 질문을 인쇄해야합니까? 소리가 안 들려요. 소스가 있습니까? 이것은 질문과 응답 이외의 출력 (사용자가 파이프를 원하는 출력)이있는 응용 프로그램에만 적용됩니까?
— UTF-8

@ UTF-8 질문 텍스트를 프로그램 출력의 일부로 간주해야합니까? 사용자가 입력 한 내용은 어떻습니까? 나는 그것이 있어야한다고 생각하지 않습니다 (쉘이 그렇게 생각하지 않는 것처럼). 그러나 응용 프로그램에 따라 다를 수 있습니까?
— Kusalananda

1
편집 해 주셔서 감사합니다. 그동안 표준 응용 프로그램의 동작을 확인했으며 답변을 읽은 후 예상대로 작동합니다.
— UTF-8

@ UTF-8 당신은이 Q & A와 관련이있을 수 있습니다 : unix.stackexchange.com/q/331611/22222
— terdon

6

에서 POSIX 사양 표준 스트림 :

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

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

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

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