2

我正在寻找与 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 使用,我假设有一种方法可以调用它,或者至少获取它的源代码,所以我不需要重新发明轮子。

编辑

要回答我为什么需要它,它与产生子进程无关。我想制作一个搜索文本的程序,以任何顺序观察多个正则表达式是否为真。但是所有的正则表达式都会在同一个文本字段中输入,所以我需要将它们分解。

4

2 回答 2

3

GNU/Linux 是由自由软件组成的,而bash是自由软件,因此您可以获取源代码并对其进行改进(并且您应该在 GPL 许可下发布您的改进补丁)。

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

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

函数wordexp(3)与您可能想要的很接近。

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

于 2012-11-20T20:02:00.673 回答
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 之类的词法扫描器生成器。

于 2012-11-20T20:10:24.473 回答