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

ulv*_*ver 26 ruby bash shell scripting

好的,这让我抓狂:

`ls #{"/media/music/Miles Davis"}`
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Cas*_*per 51

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

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

  • 优秀!谢谢!不知道那个模块. (2认同)

Cir*_*四事件 6

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

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

IO.popen(['printf', 'a b']) do |f|
  var = f.read
end
Run Code Online (Sandbox Code Playgroud)