加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-15 21:26:18 所属栏目:安全 来源:网络整理
导读:我正在为我开发的类似bash的 shell编写一个选项解析器. 尽管如此,为了与bash选项兼容,我必须阅读一些以”开头的选项,如下所示: ./42sh O autocd […] (手册页说这些选项将传递给内置shopt设置值设置). 问题是getopt_long()函数只返回以 – 或 – 开头的选项
我正在为我开发的类似bash的 shell编写一个选项解析器.

尽管如此,为了与bash选项兼容,我必须阅读一些以”开头的选项,如下所示:

./42sh O autocd […]

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

问题是getopt_long()函数只返回以 – 或 – 开头的选项,如果它们不是唯一的那样.如果是,则bash将它们分别作为标准输入的别名和选项标记的结尾.

我如何用getopt_long()获得这种类型的选项?我自己要解析这些选项吗?

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

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

一些解释:

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

一些评论:

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

解决方法

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读