Ruby转义ARGV参数或字符串作为shell命令的参数

时间:2011-08-03 04:24:01

标签: ruby bash shell scripting

好的,这让我抓狂:

`ls #{"/media/music/Miles Davis"}`

由于“Miles”和“Davis”之间的空间而失败

假设我编写了一个ruby脚本,并且用户将文件路径作为参数传递。如何将其转义并输入shell-out命令。是的,是的,我知道,应该避免炮击。但这是一个人为的例子,我仍然需要这个。

我会做system("ls", ARGV[0]),但它不会将ls的stdout输出作为字符串返回,这是反引号做得好的。

如何逃避在shellout中插入的内容?

3 个答案:

答案 0 :(得分:51)

使用require 'shellwords'Shellwords.escape,这将为您解决此类问题:

http://apidock.com/ruby/Shellwords/shellescape

答案 1 :(得分:6)

尽可能远离构建shell字符串,它是任意代码执行的精确向量。

在这种情况下,您可以使用popen,它会为您进行转义:

IO.popen(['printf', 'a b']) do |f|
  var = f.read
end

答案 2 :(得分:-2)

双引号也有效:

`ls "#{'/media/music/Miles Davis'}"`

`ls "#{ARGV[0]}"`