从Ruby调用Bash命令并返回输出?

时间:2013-04-18 14:16:31

标签: ruby

以下代码包含命令和字符串:

files = `ls /tmp`

我希望/tmp是变量而不是静态字符串,理想情况下它应该像:

dir = '/tmp'
command = 'ls ' + dir
files = `command`

实现此目的的正确Ruby语法是什么?

3 个答案:

答案 0 :(得分:3)

使用字符串插值:

dir   = '/tmp'
files = `ls #{dir}`

答案 1 :(得分:2)

files = `#{command}`

这就是你要找的东西吗?

答案 2 :(得分:2)

使用标准shellwords库。它将负责正确的转义,这将有助于保护您免受shell注入攻击。

require 'shellwords'

command = [
  'ls',
  dir
].shelljoin
files = `#{command}`

如果 dir 来自不受信任的输入,则上述代码仍允许某人查看您系统上的任何目录。但是,使用shelljoin可以防止有人注入,例如“删除我硬盘上的所有文件”命令。

在列出目录的特定情况下,内置类Dir会做得相当好:

files = Dir[File.join(dir, '*')]

这里我们使用File::join将glob添加到目录的末尾。 Dir::[]然后返回该目录中文件的路径。