Linux上的CommandLineToArgvW等价物

时间:2012-11-20 19:55:15

标签: c linux command-line-arguments

我正在寻找与Windows CommandLineToArgvW等效的功能。

我有一个字符串,我希望以bash的方式完全分解所有的角落情况 - 即考虑单引号和双引号,反斜杠等,所以分裂a b "c'd" "\"e\"f" "g\\" h 'i"j'会导致:

a
b
c'd
"e"f
g\
h
i"j

由于这样的功能已经存在并被OS / bash使用,我假设有一种方法可以调用它,或者至少得到它的源代码,所以我不需要重新发明轮子。

修改

要回答我需要它的原因,它与产生子进程无关。我想创建一个搜索文本的程序,观察多个正则表达式是否为真。但是所有正则表达式都将在同一文本字段中输入,因此我需要将它们分解。

2 个答案:

答案 0 :(得分:3)

GNU / Linux由free softwarebash组成,是免费软件,因此您可以获取源代码并对其进行改进(并且您应该根据GPL许可证发布改进的补丁)。

但是没有公共库这样做,因为shell的作用是将命令行扩展为execve(2)系统调用的参数(然后转到调用程序的main )。

(这在MS-DOS中是不同的,被调用的程序必须扩展其命令行)

函数wordexp(3)接近你想要的。

您可能想要研究更简单的shell的源代码,例如下载sash-3.7.tar.gz

答案 1 :(得分:2)

如果您希望它完全按照Bash的方式扩展字符串,则需要运行Bash。请记住,Bash执行参数扩展,命令替换等。如果它真的需要像Bash一样行动,那就打电话给Bash吧。

FILE *f = popen("bash", "r+");
fprintf(f, "echo %s", your_string);
fgets(buffer, sizeof(buffer), f);
pclose(f);

请注意,如果原始代码不够大,实际代码需要处理错误并可能分配更大的缓冲区。

鉴于您的更新要求,听起来您不想像Bash那样完全解析它。相反,您只想用引号和转义来解析空格分隔的字符串。我建议你自己动手实施;我不知道任何现成的库将完全按照您指定的方式解析字符串。你不必完全用手写它;为此,您可以使用flexRagel等词汇扫描程序生成器。