如何像shell一样拆分字符串以填充ARGV?

9
我希望能够得到一个Ruby方法或正则表达式,可以将命令行参数字符串分割成类似ARGV的数组。我的问题类似于这个问题,但是针对的是Ruby。
我正在为一个使用Trollop(尽管对于任何其他选项解析器都一样)处理命令行输入的Ruby程序编写单元测试。
我想要测试的方法看起来像这样:
def parse_args(args)
  Trollop::options(args) do
    # ... parse options based on flags
  end
end

在我的程序中,我调用了parse_args(ARGV)。在我的测试中,我原以为只需传入一个用空格分隔的字符串,但实际上 ARGV 并非如此行事。请比较以下内容:
./argv_example.rb -f -m "Hello world" --extra-args "-vvv extra verbose"
=> ["-f", "-m", "Hello world", "--extra-args", "-vvv extra verbose"]

'-f -m "Hello world" --extra-args "-vvv extra verbose"'.split
=> ["-f", "-m", "\"Hello", "world\"", "--extra-args", "\"-vvv", "extra", "verbose\""]
1个回答

11

如果你使用的是1.9版本,那么你可以使用Shellwords。如果你没有使用1.9但有Rails,则可以从Rails中获取Shellwords。在任一情况下,你都可以使用Shellwords.shellwords来解析类似于POSIX shell的字符串:

>> Shellwords.shellwords("Where is 'pancakes house'?")
=> ["Where", "is", "pancakes house?"]
如果你没有Rails或1.9,那么你可以从Rails获取shellwords.rb并使用它。
更新:看起来Shellwords在Ruby 1.8中可用(感谢Michael Khol)。我对哪些具体版本拥有它的结果产生了歧义。

4
+1,但是请注意这个方法在1.8.7版本中同样适用。(实际上我试过在1.8.6版本下也可以使用)。http://www.ruby-doc.org/ruby-1.8/classes/Shellwords.html - Michael Kohl
@Michael:谢谢,我得到了关于它在哪些版本中可用的模糊信息,所以我只包含了我可以验证的内容。 - mu is too short

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接