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


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.