2012-12-03 33 views
7

मुझे वर्तमान में उपयोग करने के लिए हमारी आंतरिक विकास टीम के लिए कुछ कमांड लाइन सहायक उपयोगिता बनाने के लिए काम सौंपा गया है। हालांकि, मैं यूनिक्स कमांड लाइन उपकरण बनाने के लिए सबसे अच्छा अभ्यास जानना चाहता हूं। पैरामीटर को पढ़ने और तदनुसार संदेशों को प्रदर्शित करने के उदाहरण के लिए मैंने git source code देखने का प्रयास किया है। हालांकि, मैं एक उपकरण बनाने, पैरामीटर को सुरक्षित रूप से पढ़ने और मानक "सहायता" संदेशों को प्रदर्शित करने के लिए एक स्पष्ट टेम्पलेट की तलाश में हूं, यदि कोई उपयोगकर्ता गलत पैरामीटर में टाइप करता है या --help मैं सहायता संदेश दिखाना चाहता हूं। क्या -abcFGH और --parameter पढ़ने और पारित पैरामीटर के आधार पर कौन सी प्रक्रिया शुरू होती है, स्विच करने के लिए मानक लाइब्रेरी है?सी/सी ++ में यूनिक्स/लिनक्स कमांड लाइन उपकरण बनाने के लिए सबसे अच्छा अभ्यास क्या है?

कमांड लाइन:

git 

या

git --help 

आउटपुट:

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>] 
... 

कमांड लाइन:

MyTool CommandName --CommandArgs 

आउटपुट:

जो कुछ भी है कि विशिष्ट आदेश नहीं करता है।


क्या मैं अब तक काम कर रहा है:

कोड:

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(); 
} 

क्या इस प्रकार दिखाई देगा आदर्श होगा:

कोड:

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

आप 'getopt()' को देखा है? यदि नहीं, तो 'getopt_long' देखें जो आप चाहते हैं, और आंखों पर भी आसान है। –

उत्तर

8

getopt_long() आप जो खोज रहे हैं, यहाँ है सबसे आसान उपयोग के एक उदाहरण है:

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

Getopt लाइब्रेरी पर एक नज़र डालें।