경고 나 에러가 발생했을 때 프로그램 명을 출력해야합니까?


13

스크립트 또는 프로그램을 작성하는 경우 경고 또는 오류 메시지와 함께 해당 이름을 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 보다는 여기에서 더 적절하다고 생각했습니다 .


5
프로그램 이름은 파이프 라인 no such file에서 어떤 프로그램을 아는 사람으로부터 무작위 로 디버깅하는 데 도움이 될 수 있습니다 foo | bar | baz.
thrig

@thrig 감사합니다, 좋은 지적입니다. 광산은 파이프로 연결되어서는 안되지만 누가 알고 있어야합니다. 표준 행동을 고수하는 것이 낫습니다.
gsarret

답변:


16

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 등 )이 정보를 구문 분석 하기가 복잡 합니다.

컴파일러의 경우 메시지에 범주 를 사용 하면 치명적 오류 ( 즉시 치명적이지 않을 수 있음 ) 및 경고를 간단하게 감지 할 수 있습니다 . 프로그램이 오류로 종료되면 일부는 실제로 경고이고 일부는 오류라고 말하지 않습니다. 그러나 다르게 동작하거나 계속 작동하면 범주는 발생한 문제를 진단하는 데 도움이됩니다.


예를 들어 주셔서 감사합니다. "오류"와 "경고"는 어떻습니까?
gsarret

마지막 편집-정확히 내가 생각한 것! 어쨌든 err 메시지 직후에 종료되면 어떻게 사용됩니까? 다시 감사합니다.
gsarret

8

많은 다른 프로그램이 호출되는 스크립트의 일부로 프로그램이 호출되고 이름이 인쇄되지 않으면 사용자는 오류가 발생한 위치를 파악하기가 어렵습니다.

(오류가 디버깅이 필요할 수있는 예기치 않은 내부 조건 인 경우 프로그램 이름뿐만 아니라 소스 파일과 줄 번호 및 역 추적과 같은 추가 정보가 필요합니다.)


감사. 나는 보통 나 자신을위한 프로그램 (숫자 시뮬레이션)을 작성하므로 한 명의 사용자 만이 있지만 언젠가는 공유 할 수 있습니다. 그들은 또한 그렇게 복잡하지는 않지만 (적어도 아직은) 오류의 원인을 찾는 데 아무런 문제가 없지만 힌트 덕분에 미래에는 유용 ​​할 수 있습니다.
gsarret
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.