如何获取以“+”字符开头的选项的值?

How to get the value of an option which begins with '+' character?

我正在为我开发的 bash-like shell 编写一个选项解析器。

然而,为了与 bash 选项兼容,我必须阅读一些以“+”开头的选项,例如:

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

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

问题是 getopt_long() 仅对 returns 以 --- 开头的选项起作用,如果它们不是单独的的话。如果是,bash 将它们分别视为标准输入的别名和选项标记的结尾。

如何使用 getopt_long() 获得此类选项?我必须自己解析这些选项吗?

编辑:根据@jxh 回复和man 3 getopt 页面,我发现getoptgetopt_long 安排了**argv 参数数组来移动所有参数最后似乎不是有效的选择 - 从他们的角度来看。因此,我在获得 normal 选项的常用代码之后编写了以下代码(非常感谢所有建议和评论):

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

一些解释:

一些评论:

正如您在研究中指出的那样,您不能使用 getopt_long 来解析以 + 开头的选项。

作为变通方法,您可以自己扫描 argv[],然后创建一个新的参数向量,在您认为是 + 样式选项的每个参数前面替换 --plus-原来argv[]。这个新数组应该可以被 getopt_long.

解析