如何获得以"+"字符开头的选项的值?

Fra*_*hal 4 c bash c99 getopt getopt-long

我正在为我开发的类似bash的shell编写一个选项解析器.

然而,为了与bash选项兼容,我必须阅读一些以'+'开头的选项,如下所示:

./42sh +O autocd [...]

(手册页说这些选项将传递给内置shopt,它设置设置的值).

问题是,getopt_long()函数仅返回与一开始的选项-或者--,如果他们并不孤单.如果是,则bash将它们分别作为标准输入的别名和选项标记的结尾.

我怎么能得到这种类型的选择getopt_long()?我自己要解析这些选项吗?

编辑:根据@jxh响应和man 3 getopt页面,我发现getoptgetopt_long安排**argv参数数组移动所有看起来不是有效选项的参数 - 从他们的角度来看 - 最后.所以,我在通常的代码之后编写了以下代码,获得了正常的选项(所有建议和评论都非常感激):

EDIT2:由于在循环的每次迭代中使用strdup()而导致内存泄漏.

for(; optind < argc; ++optind)
{
    const char *argv_copy = strdup(argv[optind]);
    if (argv_copy[0] == '+' && argv_copy[1] == 'O')
    {
        /* A deactivation parameter have been just found ! */
        if (handle_shopt_options(shell_options,
                                 argv[optind + 1],
                                 DISABLE) == EXIT_FAILURE)
        {
            usage(argv[optind]);
            free_shell_options(shell_options);
            shell_options = NULL;
        }
            ++optind;
    }
    free(argv_copy);
    argv_copy = NULL;
}
Run Code Online (Sandbox Code Playgroud)

一些解释:

  • optind是一个argv索引,告诉我们在下一次传递中将解析哪个参数.由于我们解析了所有getopt()视点的有效参数,并且由于getopt()在末尾移动了所有非选项,因此我们将解析所有剩余的参数,包括我们感兴趣的参数.
  • argv[argc] == NULL:这个技巧用于知道参数列表的结尾在哪里,所以在解析参数时没用optind == argc.
  • argv不习惯直接使用当前值,所以我更喜欢用新字符串复制它,但我可能错了,要进行修改.

一些评论:

  • getopt_long()仅在_GNU_SOURCE定义宏时才可用.
  • strdup()仅在宏_XOPEN_SOURCE >= 500或宏时才可用_POSIX_C_SOURCE >= 200809L.

jxh*_*jxh 5

正如您在研究中所指出的那样,您无法使用getopt_long解析开头的选项+.

作为一种解决方法,您可以扫描argv[]自己,然后创建一个新的参数向量,替换--plus-为您认为是+原始样式选项的每个参数argv[].这个新数组应该是可解析的getopt_long.