명령줄 애플리케이션을 작성할 때 오류를 언제 사용해야 하는지에 대한 지침이 있습니까? 놀랍게도 구글링을 해보니 아무것도 나오지 않았습니다.
특히 현재 우려되는 점은 사용자가 잘못된 매개변수를 사용하여 프로그램을 호출하는지 여부 stdout
입니다 . stderr
그러나 사용자가 기대하는 방식으로 동작하는 프로그램을 작성하기 위해 명시적인 규칙이 필요한 유일한 경우는 아니기 때문에 보다 포괄적인 답변을 주시면 감사하겠습니다.
답변1
stderr
예, 잘못된 매개변수가 사용되면 항상 메시지가 표시됩니다. 이로 인해 애플리케이션이 종료되는 경우 0이 아닌 종료 상태로 종료하십시오.
표준 오류 스트림을 사용해야 합니다.진단 정보또는 사용자 상호 작용을 위해. 진단 메시지에는 유틸리티가 올바르게 실행될 때 유틸리티 출력의 일부가 아닌 오류 메시지, 경고 및 기타 메시지가 포함됩니다. "올바른"이란 파일을 찾을 수 없거나 다른 어떤 일도 발생하지 않는 등 비정상적인 일이 발생하지 않음을 의미합니다.
많은 쉘(모두?)은 프롬프트, 사용자가 입력하는 내용, 메뉴 등을 표시하므로 stderr
리디렉션이 stdout
의미 있는 방식으로 쉘과 상호 작용하는 것을 방해하지 않습니다.
다음 내용은 다음에서 가져온 것입니다.블로그 게시물이 주제와 관련하여:
이것은 Unix 파이프의 발명가인 Doug McIllroy가 그 탄생 과정을 설명하는 인용문입니다
stderr
. "v6"은 1975년에 출시된 원래 Unix 운영 체제의 특정 버전을 나타냅니다.모든 프로그램은 표준 출력에 진단 정보를 배치합니다. 이는 출력이 파일로 리디렉션될 때 항상 문제를 일으키지만, 의심하지 않는 프로세스로 출력이 전송되면 참을 수 없게 됩니다. 그럼에도 불구하고 사람들은 표준-내-표준-출력 모델의 단순성을 파괴하는 것을 꺼려했기 때문에 이는 v6에서 허용되었습니다. 그 직후 Dennis Ritchie는 표준 오류 파일을 도입하여 이 문제를 해결했습니다. 그러나 이것만으로는 충분하지 않습니다. 파이프를 사용하면 동시에 실행되는 여러 프로그램에서 진단 정보를 얻을 수 있습니다. 자신을 식별하기 위해서는 진단 정보가 필요합니다. ——Doug
McIllroy, "UNIX 연구: 프로그래머 매뉴얼에서 주석이 달린 발췌문, 1971-1986"
"신원을 확인하세요"는 단순히 "야! 내 얘기야! 뭔가 잘못됐어: [...]"라고 말하는 것을 의미합니다.
$ ls nothere
ls: nothere: No such file or directory
stderr
그렇지 않으면 읽고 있는 모든 항목에서 읽을 수 있기 때문에 이렇게 하는 것이 더 좋습니다 stdout
(그러나ls
어차피 우린 그런 짓 안 할 거야, 그래야 할까요? ).
답변2
~에서POSIX 사양표준 스트림의 경우:
프로그램이 시작되면 표준 입력(일반 입력 읽기용), 표준 출력(일반 출력 쓰기용) 및 세 가지 스트림이 미리 정의되어야 하며 명시적으로 열 필요가 없습니다.표준 오류(진단 출력을 작성하는 데 사용됨)).
즉, 오류, 디버그 정보 및 진단 범주에 속하는 모든 것이 stderr
.
자세한 내용은 관련 질문을 참조하세요.진행 보고서/로그 정보가 stderr 또는 stdout에 속합니까?