2012-12-03 11 views
7

Obecnie mam zadanie tworzenia narzędzi pomocniczych wiersza poleceń dla naszego wewnętrznego zespołu programistycznego. Jednak chcę poznać najlepszą praktykę tworzenia narzędzi wiersza polecenia systemu Unix. Próbowałem wyświetlić git source code, aby zapoznać się z przykładowym sposobem odczytywania parametrów i wyświetlania komunikatów. Jednak szukam jasnego szablonu do tworzenia narzędzia, bezpiecznego odczytu parametrów i wyświetlania standardowych komunikatów "pomocy", jeśli użytkownik wpisze nieprawidłowy parametr lub --help Chcę wyświetlić komunikat pomocy. Czy istnieje standardowa biblioteka do odczytu -abcFGH i --parameter i przełączania, który proces rozpoczyna się w oparciu o przekazany parametr?Jaka jest najlepsza praktyka w tworzeniu narzędzia wiersza polecenia unix/linux w języku C/C++?

Command-Line:

git 

lub

git --help 

wyjściowa:

usage: git [--version] [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path] 
     [-p|--paginate|--no-pager] [--no-replace-objects] [--bare] 
     [--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>] 
     [-c name=value] [--help] 
     <command> [<args>] 
... 

Command-Line:

MyTool CommandName --CommandArgs 

wyjściowa:

Cokolwiek to specyficzna komenda robi.


Co mam pracę do tej pory:

Kod:

int main(int argc, char **argv) 
{ 
    if(argc < 2) 
    helpMessage(); 
    char* commandParameter = argv[1]; 
    if (strncmp(argv [1],"help", strlen(commandParameter)) == 0) 
     helpMessage(); 
    else if (strncmp(argv [1],"pull", strlen(commandParameter)) == 0) 
     pull(); 
    else 
     helpMessage(); 
} 

Jaki byłby idealny będzie wyglądać następująco:

kod:

int main(int argc, char **argv) 
{ 
    MagicParameters magicParameters = new MagicParameters(argv); 
    switch(magicParameters[1]) 
    { 
     case command1: 
      Command1(); 
      break; 
     case ... 

     case help: 
     default: 
      HelpMessage(); 
      break; 
    } 
} 
+2

Pan spojrzał na 'getopt()'? Jeśli nie, sprawdź 'getopt_long', który jest, co chcesz, i jest również łatwiejsze dla oczu. –

Odpowiedz

8

getopt_long() jest to, czego szukasz, oto przykład najprostszego użycia:

static const struct option opts[] = { 
     {"version", no_argument, 0, 'v'}, 
     {"help",  no_argument, 0, 'h'}, 
     {"message", required_argument, 0, 'm'}, 
     /* And so on */ 
     {0,  0,     0, 0 } /* Sentiel */ 
    }; 
    int optidx; 
    char c; 

    /* <option> and a ':' means it's marked as required_argument, make sure to do that. 
    * or optional_argument if it's optional. 
    * You can pass NULL as the last argument if it's not needed. */ 
    while ((c = getopt_long(argc, argv, "vhm:", opts, &optidx)) != -1) { 
     switch (c) { 
      case 'v': print_version(); break; 
      case 'h': help(argv[0]); break; 
      case 'm': printf("%s\n", optarg); break; 
      case '?': help(argv[0]); return 1;    /* getopt already thrown an error */ 
      default: 
       if (optopt == 'c') 
        fprintf(stderr, "Option -%c requires an argument.\n", 
         optopt); 
       else if (isprint(optopt)) 
        fprintf(stderr, "Unknown option -%c.\n", optopt); 
       else 
        fprintf(stderr, "Unknown option character '\\x%x'.\n", 
         optopt); 
       return 1; 
     } 
    } 
    /* Loop through other arguments ("leftovers"). */ 
    while (optind < argc) { 
     /* whatever */; 
     ++optind; 
    } 
2

Zobacz bibliotekę getopt.

Powiązane problemy