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

好吧这让我抓狂:

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

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

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

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

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

使用require 'shellwords'Shellwords.escape ,它将为您修复此类内容:

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

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

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

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

双引号也有效:

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

要么

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