将数组转换为shell命令的参数

时间:2014-09-05 19:07:03

标签: ruby

我尝试做类似的事情:

list = Dir["*.mp4"]
`zip "test.zip" "#{list}"`

但是#{list}作为数组出现,我该如何解决?

3 个答案:

答案 0 :(得分:3)

您应该使用标准库中的Shellwords,该标准库专门用于执行此操作,并且无论您的文件名有多奇怪,都可以正确转义:

require 'shellwords'

list = Dir["*.mp4"]

puts [ "zip", "test.zip", *list ].shelljoin
# => zip test.zip foo.mp4 filename\ with\ spaces.mp4 etc.mp4

答案 1 :(得分:2)

看起来你没有将结果存储在任何地方,所以你应该使用system的多参数形式并完全绕过shell:

system('zip', 'test.zip', *list)

由于没有调用shell,你不必担心引用或解析或任何废话,只需构建一个字符串列表并将其展开。

如果确实需要捕获输出,请使用Open3方法之一。反引号几乎总是错误的方法,有太多尖锐的边缘(只需浏览Ruby的CERT报告,你就会看到反引号和system的单个参数形式引起问题的频率)。

答案 2 :(得分:0)

http://www.ruby-doc.org/core-2.1.2/Array.html#method-i-join

您正在寻找加入方法

["a","b","c"].join(" ") => "a b c"

["a","b","c"].join("-|-") => "a-|-b-|-c"