경고나 오류가 발생하면 프로그램 이름을 출력해야 합니까?

경고나 오류가 발생하면 프로그램 이름을 출력해야 합니까?

스크립트나 프로그램을 작성하는 경우 경고나 오류 메시지와 함께 해당 이름을 stderr에 출력해야 합니까? 예를 들어:

./script.sh: Warning! Variable "var" lowered down to 10.

또는:

./prog.py: Error! No such file: "file.cfg".

나는 그것이 일반적으로 단지 취향의 문제라는 것을 알고 있습니다(특히 당신이 스스로 자신의 것을 작성하는 경우). 그러나 이것에 대해 전통적인 것이 있는지 궁금합니다. 나는 대부분의 UNIX/Linux 유틸리티가 어떤 일이 발생할 때 자신의 이름을 쓴다고 생각하므로 이는 좋은 일처럼 보이지만 이를 수행하는 방법과 수행하지 않는 방법에 대한 지침이나 암묵적인 규칙이 있습니까?

/usr/bin/예를 들어 바이너리를 아래에 설치하는 것이 아니라 대신 /usr/local/bin/또는 다른 위치 에 설치하는 것이 좋습니다 . stderr로의 출력에도 비슷한 규칙이 있습니까? 이름 뒤에 콜론을 붙여야 하나요? 아니면 "경고!"라는 단어만 있나요? 아무것도 찾을 수 없지만 누군가가 내가 그것에 대해 읽을 수 있는 곳을 알려줄 수도 있습니다.

이 질문은 프로그래밍 관행에 관한 것이지만 위의 것보다 여기에 더 적합하다고 생각합니다.스택 오버플로, 일반적인 프로그래밍보다는 UNIX/Linux 전통에 관한 것이기 때문입니다.

답변1

일반적인 접근 방식은 저장하는 것입니다.0번C 프로그램에 인수를 전달하고 이를 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와 유사한 이맥스) 정보를 구문 분석합니다.

컴파일러의 경우 다음을 사용하십시오.범주메시지 내용을 통해 치명적인 오류를 감지할 수 있습니다.즉시 치명적) 및 경고. 프로그램이 오류와 함께 종료된다고 해서 일부는 실제 경고이고 일부는 오류라는 의미는 아닙니다. 그러나 다르게 동작하는 경우(또는 어느 정도 계속 작동하는 경우) 이 범주는 발생한 문제를 진단하는 데 도움이 됩니다.

답변2

프로그램이 다른 많은 프로그램을 호출하는 스크립트의 일부로 호출되고 해당 이름이 인쇄되지 않으면 사용자가 오류의 원인을 파악하기 어려울 수 있습니다.

(오류가 디버깅이 필요할 수 있는 예상치 못한 내부 상황인 경우 프로그램 이름뿐만 아니라 소스 파일과 줄 번호, 역추적 등 추가 정보가 필요합니다.)

관련 정보