-1
假设我有这样一个字符串以下解析壳报价串入execv兼容参数向量
echo "foo" "bar\"blub""baz" "'" "\"" foo\ bar "\\" '\'' """" Lots" "of\ whitespace
现在我想执行上面的字符串为命令,如果它是通过对Unix.execv
呼叫键入到外壳。如果我没有犯任何错误,那么外壳将解析上述分为以下ocaml的名单:
["echo"; "foo"; "bar\"blubbaz"; "'"; "\""; "foo bar"; "\\"; "'", "", "Lots of whitespace"]
哪个库让我从原来的字符串来解析名单?
最终我想把结果列表交给Unix.execvpe
。还有Unix.open_process_full
,它能够通过使用/bin/sh
来处理我的原始字符串,但是我发现在直接调用外部程序时没有使用/bin/sh
,我的应用程序速度提高了16%。现在我想能够接受更多的输入字符串,包括引用和转义。
我必须推出自己的解析器吗?
存在POSIX函数wordexp
但包装该函数不会解决我的问题,因为wordexp
比我想要的更多(命令替换,计算globs,替换tilda和环境变量)。
我只想要引用和转义解决。
我不知道标准(如“POSIX或...”标准)的功能,可以完成您想要的工作。这意味着你很可能最终会滚动你自己的,或者挖掘一个或多个shell的代码等。 – 2015-04-01 22:37:57
为什么你想要将类似但不完全像shell的词分开?你如何确定你想要支持哪些语法功能,以及哪些不支持?为什么'sh',而不是一个更好的引用格式? – 2015-04-02 05:40:25
@thatotherguy输入来自一个配置文件,该文件存储要在变量中执行的字符串。该字符串不应该包含通配符,环境变量或tilda。如果我使用'wordexp',那么我不能告诉它抛出错误或以其他方式拒绝解析包含这些东西的字符串。你问为什么不比POSIX shell更好的引用格式? – josch 2015-04-02 06:44:37