好的,这让我抓狂:
`ls #{"/media/music/Miles Davis"}`
由于“Miles”和“Davis”之间的空间而失败
假设我编写了一个ruby脚本,并且用户将文件路径作为参数传递。如何将其转义并输入shell-out命令。是的,是的,我知道,应该避免炮击。但这是一个人为的例子,我仍然需要这个。
我会做system("ls", ARGV[0])
,但它不会将ls的stdout输出作为字符串返回,这是反引号做得好的。
如何逃避在shellout中插入的内容?
答案 0 :(得分:51)
使用require 'shellwords'
和Shellwords.escape
,这将为您解决此类问题:
答案 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]}"`