인쇄 사용법 / 도움말 (--help)에 대한 모범 사례는 무엇입니까?


13

UNIX CLI 용 도구를 작성할 때 프로그램에서 도움말 및 / 또는 사용법을 인쇄하려면 어떻게해야합니까?

나는 보통을 사용 fprintf(stderr, "help text here");하지만 그것에 몇 가지 문제가 있습니다.

  • 먼저을 사용해야하는지 잘 모르겠습니다 stderr. 괜찮 stdout습니까 , 아니면 사용해야 합니까?
  • 상상할 수 있듯이 도구의 옵션 수에 따라 도움말 텍스트가 매우 깁니다. 이제 보통 "strings like that\n"두 번째 매개 변수 에 여러 개 를 넣습니다 . 그러나 이것은 내 소스 코드를 50 줄 이상의 도움말 텍스트로 채 웁니다. 전혀 관리하기 쉽지 않습니다. 대신 어떻게해야합니까?
  • 도구가 C 또는 C와 같은 언어로 작성되지 않은 경우 가능한 경우 여기에서 문서 를 사용하는 경향이 있습니다 (대부분 Perl에서 두드러짐). 나는 그것을 C에서 사용할 수 없지만 사용할 수있는 것이 있습니까?
  • 나는에 넣어 고려하고 headerfile.h돌며 것은 #define HELP "help text here", 내가 야생에서 본 적이 없어, 나는 실제로 그것을 사용해야하는지 여부를 알 수 없습니다.

이상적으로는 텍스트를 외부 파일에 넣고 포함시킬 수있었습니다. #include그러나 그것을 사용 하는 것은 잘못 된 것 같습니다. 그러면 어떻게해야합니까?

아이디어는 쉽게 관리 할 수있는 도움말 텍스트를 갖는 것입니다. 소스 코드 안에 넣는 것은 실제로 편리하지 않습니다.


1
소스 코드에서 약 50 줄이 나쁜 이유는 무엇입니까? 그냥 끝에 넣으십시오. 정기적으로 엉망이되는 것은 아닙니다.
whatsisname

2
@whatsisname 사용법, 정상 및 longopt에 대한 도움말. 소스 코드에 약 200 줄의 문자열이 생깁니다. 그 외에, 나는 단지 등 도움말 텍스트에서 퍼팅의보다 효율적인 방법이 있어야이 등, 가장 좋은 방법은 생각하지 않는다
폴몬

답변:


8

대상 플랫폼의 내부에서 영감을 얻으십시오

BSD의 소스 코드를 살펴보십시오. 예를 들면 다음과 같습니다.

  • usage(void)NetBSD의 /usr/bin/uname도구 [ source ] :

    usage(void)
    {
        fprintf(stderr, "usage: uname [-amnprsv]\n");
        exit(EXIT_FAILURE);
    }
    
  • usage(void)NetBSD 용 /usr/bin/telnet[ source ]

  • usage(void)OpenBSD 용 /bin/ls[ source ]

대안을 살펴보십시오

그리고 그들이 나아지는지 스스로 결정하십시오. Google CodeSearch를 사용하여 다음과 같은 다른 사람을 찾을 수 있습니다.

  • SkyLoad의 사용법 [ 출처 ]

보시다시피, 위에 나열된 BSD 시스템 통합 도구와 이들 사이의 다른 스타일. 그것은 당신 하나 또는 다른 것을 따라야 한다는 것을 의미하지는 않습니다 . 그러나 일반적으로 주변을 둘러보고 일관된 솔루션을 찾는 것이 좋습니다.

50 가지 라인에 대한 비표준 솔루션 ...

50 줄의 텍스트를 피하지 않으려면 텍스트 파일에서 도움말을 읽으십시오 (일반 텍스트로 작성하거나 man소스를 만든 경우 직접 소스를 구문 분석 할 수 있음). 나는 본질적으로 안전하지 않고 실패 지점을 소개하는 핵심 시스템 프로그램에 대해서는 다소 우아한 방법 (텍스트 문서조차도 볼 수 있음)을 발견했습니다. 다른 사람들은 그것이 메시지 usagehelp메시지에 대해 무겁다 고 주장 할 것입니다 .

의심스러운 경우 거인을 따르십시오.


9

내가 사용 stdout도움말 오류가 아니기 때문에.

이것이 C에서 긴 도움이된다면 here-docs를 모방하려고합니다.

printf("This is the help for MyWonderfulApp\n"
       "Options are:\n"
       "    --help: display what you are reading now\n"
       "    --quiet: output nothing\n");

그러나 대부분 전용 태그를 man사용하여 페이지를 작성 nroff -man합니다. 인앱 도움말은 해당 man페이지 를 참조하여 구성됩니다 .


그러나 도움이 반드시 바람직한 표준 출력은 아닙니다. 그렇지 않습니까? 어때요 stdlog?
greyfade

@ greyfade : stdlog표준 C입니까?
mouviciel

@ mouviciel : ... 나는 생각했다. 나는 그렇지 않다고 생각한다. C ++는 관련 표준 스트림을 가지고 ( cin, cout, cerr, 및 clog), 그래서 나는 내가 생각했던 것 같아요 stdlogC 표준에 있었다. 내 잘못이야.
greyfade

2

내가 당신을 것 경우 그냥의 소스를 열어 것 grep, tail, cat, your_other_favorite_unix_shell_command그것이이 어떻게하는지 볼 수 있도록합니다. 나는 그들의 길을 잘 생각하고 많은 사람들이 유지할 수 있다고 확신합니다.

stderr이나 stdout. 오류가 있거나 stderr정보가있는 경우 쓰기가 정말 간단 stdout합니다. 예를 들어, 잘못된 옵션으로 도구를 실행하는 경우 오류가 표시 될 수 있습니다 (예 :이 도구 Use --help for usage는에 속해 있음) stderr. 유효한 옵션으로 도구를 실행하는 경우 --help사용하십시오 stdout.

코드 근처에 긴 도움말 문자열을 사용하지 않는 것이 좋습니다. 헤더 파일의 #define은 완벽하지만 괜찮은 개인 취향입니다. 명령 줄 도구의 코드를 읽어야하는 경우 도움말 문자열이 사용자가 제공 한 옵션을 처리하는 파일 안에있는 것이 좋습니다.


2
그것은 그의 질문에 대답하지 않습니다.
Mavrik

흠, 빼고 무슨 일이야? 무엇 때문에?
devmiles.com

@Mavrik : 첫 번째 단락이 않습니다.
haylem

1

gnu getopts 라이브러리를 사용합니다 . 도움이되는 예제 는이 샘플 프로젝트 , 특히 parser.y 의 맨 아래에있는 주요 메소드를 참조하십시오 .

그것이 중괄호로 싸여 있기 때문에, 내가 사용하는 vim 편집기는 선을 함께 접을 수 있으며 필요하지 않을 때조차도 눈에 띄지 않습니다.


1

C를 사용하거나 Boost 라이브러리에 의존하지 않으려면 GNU를 고수하십시오 getopt. 그렇지 않으면 도움말을 자동으로 인쇄 하는 부스트 프로그램 옵션 을 선호합니다 .

또한 옵션 처리와 관련하여 올바른 옵션 중 하나를 모범 사례 중 하나로 추측하는 것이 좋습니다. 나는 Git에서 그것을 배웠고 이제는 내 프로젝트에서 같은 것을 사용합니다. 사용자가 알 수없는 명령 행 옵션을 입력하면 기본적으로 Damerau–Levenshtein 거리를 사용하여 최상의 일치 항목을 인쇄합니다.

나는 당신 예로서 사용할 수 있는 작은 기사를 썼습니다 .

그것이 도움이되기를 바랍니다 :)


1

분명히 cout << 또는 printf () 코드 에 홀 페이지를 작성하는 것은 번거 롭습니다. 특히 단락을 변경하고 다시 채워야하는 경우 더욱 그렇습니다. 따라서 텍스트를 보다 쉽게 ​​형식화 할 수있는 emacs 와 같은 별도의 파일에서 해당 텍스트를 편집하는 것이 좋습니다 .

그런 다음 다음 sed 스크립트를 사용하여 해당 텍스트 파일을 유효한 C 헤더 파일로 변환 할 수 있습니다 .

s/\"/\\\"/g
s/$/\\n"/
s/^/"/
1i\
const char *helpStr = 
$a\
;

그런 다음 헤더 파일을 소스 코드 에 # include- 하면 다음을 사용하여 간단히 텍스트를 작성할 수 있습니다.

cout << helpStr;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.