在 C/C++ 中创建 unix/linux 命令行工具的最佳实践是啥?

Posted

技术标签:

【中文标题】在 C/C++ 中创建 unix/linux 命令行工具的最佳实践是啥?【英文标题】:What is the best practice for creating a unix/linux command-line tool in C/C++?在 C/C++ 中创建 unix/linux 命令行工具的最佳实践是什么? 【发布时间】:2012-11-21 10:02:34 【问题描述】:

我目前的任务是创建一些命令行帮助实用程序供我们的内部开发团队使用。但是,我想知道创建 unix 命令行工具的最佳实践。我已尝试查看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;
    

【问题讨论】:

你看过getopt()吗?如果没有,请检查getopt_long,这是您想要的,也更容易眼睛。 【参考方案1】:

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 库。

【讨论】:

以上是关于在 C/C++ 中创建 unix/linux 命令行工具的最佳实践是啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C 中创建模块

如何在 C/C++ 中创建 JNIEnv 模拟

C/C++:std::thread构造函数死锁问题:WIN32下不可以在DllMain中创建线程

在数据框中创建字典类型列

在Java中调用C/C++代码实现

从 C++ 访问在 python 中创建的 C++ 类