【问题标题】:CommandLineToArgvW equivalent on LinuxLinux 上的 CommandLineToArgvW 等效项
【发布时间】:2012-11-08 23:36:44
【问题描述】:

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

编辑

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

【问题讨论】:

  • 我的第一个想法是:你需要吗?你用这个干什么?
  • 我正在尝试制作一个文本搜索程序,您可以在其中在同一字段中输入多个正则表达式。不是在单独的框中输入它们,而是一次输入,但它们是根据这些规则分解的。由于反斜杠和特殊字符在正则表达式中很重要,因此我需要将它们考虑在内。
  • 这可能不是处理多个正则表达式的最佳方式,因为正则表达式通常包含空格和引号。我会对用 shell 引用规则解析的正则表达式感到困惑。也许您可以像许多语言一样用斜线分隔它们,例如/foo bar.*/ /baz*/.
  • 是的,但最常见的(如 99%)正则表达式实际上是由空格分隔的纯单词。正则表达式只是一个非常高级的选项。对于最常见的情况,只键入以空格分隔的单词会更自然。
  • @satuon 你可能不希望它表现得“完全像 bash”,因为 bash 以一种相当令人惊讶的方式做到了(例如,你不能在单引号内使用反斜杠来引用单引号)。您说这样的函数已经存在,但正如我所提到的,Bash 实现的功能不仅仅是字符串拆分。您可能只想自己实现解析器。

标签: c linux command-line-arguments


【解决方案1】:

如果您希望它完全按照 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 之类的词法扫描器生成器。

【讨论】:

  • 我会尝试,但是这种字符串解析通常有很多极端情况,这意味着很多潜在的错误。这就是我想使用经过验证的代码的原因。
  • @satuon 您不必完全手动完成。您可以使用解析器生成器。对于这个简单的任务,状态机生成器Ragel 可能会很好地工作。
【解决方案2】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2018-11-26
    • 1970-01-01
    • 2010-09-14
    • 2010-09-05
    • 2017-02-11
    • 1970-01-01
    • 1970-01-01
    • 2020-11-22
    相关资源
    最近更新 更多