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页面,我发现getopt并getopt_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.正如您在研究中所指出的那样,您无法使用getopt_long解析开头的选项+.
作为一种解决方法,您可以扫描argv[]自己,然后创建一个新的参数向量,替换--plus-为您认为是+原始样式选项的每个参数argv[].这个新数组应该是可解析的getopt_long.
| 归档时间: |
|
| 查看次数: |
100 次 |
| 最近记录: |