스크립트 또는 프로그램을 작성하는 경우 경고 또는 오류 메시지와 함께 해당 이름을 stderr에 출력해야합니까? 예를 들면 다음과 같습니다.
./script.sh: Warning! Variable "var" lowered down to 10.
또는:
./prog.py: Error! No such file: "file.cfg".
나는 일반적으로 맛의 문제라는 것을 이해합니다 (특히 자신을 위해 직접 물건을 쓰는 경우). 그러나 그에 대한 기존의 것이 있는지 궁금합니다. 나는 대부분의 유닉스 / 리눅스 유틸리티가 어떤 일이 일어날 때 그들의 이름을 쓴다고 믿기 때문에 좋은 것 같지만 어떻게해야하는지에 대한 지침이나 무언의 규칙이 있습니까?
예를 들어, /usr/bin/
아래 /usr/local/bin/
또는 오히려 다른 곳에 바이너리를 설치하지 않는 것이 좋습니다 . stderr 로의 출력에 대해 비슷한 규칙이 있습니까? 이름 뒤에 콜론을 써야합니까? 아니면 그냥 “경고!” “오류!” 말? 나는 아무것도 찾을 수 없었지만 누군가 그것에 대해 읽을 곳을 가리킬 수있었습니다.
이 질문은 프로그래밍 실습에 관한 것이지만 , 일반적인 프로그래밍이 아닌 UNIX / Linux 전통에 관한 것이므로 stackoverflow 보다는 여기에서 더 적절하다고 생각했습니다 .
답변
C 프로그램에 전달 된 0 번째 인수 를 저장하고이를 간단한 프로그램 main
의 매개 변수로 사용하는 것이 일반적입니다 perror
.
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
char *foo = malloc(9999999999L);
if (foo == 0)
perror(argv[0]);
return 0;
}
해당 프로그램을 “foo”라고 부르고 실행하면 요점을 알 수 있습니다.
> ./foo
./foo: Cannot allocate memory
복잡한 프로그램은 텍스트에 추가하거나 경로없이 파일 이름 만 사용할 수 있지만 프로그램 이름을 유지하면 오작동하는 프로그램의 위치를 찾을 수 있습니다.
오류 메시지에 대해 보편적으로 허용되는 체계는 없지만 gcc와 같이 널리 사용되는 일부 프로그램은 “오류”또는 “경고”와 같은 메시지 범주를 추가합니다. 다음은 내 빌드 로그 중 하나의 예입니다.
compiling fld_def (obj_s)
../form/fld_def.c: In function '_nc_Copy_Argument':
../form/fld_def.c:164:14: warning: cast discards 'const' qualifier from pointer target type [-Wcast-qual]
res = (TypeArgument *)argp;
^
이 예에서 gcc는 콜론으로 필드를 구분하고 파일 이름, 행 번호, 열 번호 뒤에 그리고 실제 메시지 앞에 “경고”범주를 추가합니다. 그러나 여러 변형이있어서 프로그램 ( vi-like-emacs 등 )이 정보를 구문 분석 하기가 복잡 합니다.
컴파일러의 경우 메시지에 범주 를 사용 하면 치명적 오류 ( 즉시 치명적이지 않을 수 있음 ) 및 경고를 간단하게 감지 할 수 있습니다 . 프로그램이 오류로 종료되면 일부는 실제로 경고이고 일부는 오류라고 말하지 않습니다. 그러나 다르게 동작하거나 계속 작동하면 범주는 발생한 문제를 진단하는 데 도움이됩니다.
답변
많은 다른 프로그램이 호출되는 스크립트의 일부로 프로그램이 호출되고 이름이 인쇄되지 않으면 사용자는 오류가 발생한 위치를 파악하기가 어렵습니다.
(오류가 디버깅이 필요할 수있는 예기치 않은 내부 조건 인 경우 프로그램 이름뿐만 아니라 소스 파일과 줄 번호 및 역 추적과 같은 추가 정보가 필요합니다.)