在Ruby脚本中执行shell脚本命令

3

我有一个非常基础的问题。我正在运行一个Ruby脚本来访问Linux中一个目录的内容。当执行Ruby脚本时,该目录被通过命令行传递。

我的问题是如何在Ruby命令中使用命令行参数?

我已经设置了如下:

usrDirectory = ARGV[0]
lsCmd = `ls -l`

我需要使用类似于"ls -l usrDirectory"的命令,我能直接像这样插入命令吗?

4个回答

2
以上说法是正确的,如果你想要将 ls 的输出显示在标准输出中,可以使用以下方式使其更加简洁:
system("ls", "-l", dir)

这将使Ruby将输出打印到标准输出而不是像上面那样将输出放入变量中。

3
如果你要使用system,应该使用多参数版本:system('ls', '-l', dir) - mu is too short

1

你应该能够在不使用 shell 的情况下获得你想要的东西,例如:

usr_dir = "/tmp"
files = Dir["#{usr_dir}/*"]

p files

无论你在做什么,当将用户输入的文本作为被解析和执行的一部分传递给 shell 时,务必非常小心。例如,如果用户输入的是以下内容(而不是目录名称)会发生什么呢?
;rm -rf /*

?


1
这就是为什么你要使用这些命令的多参数版本,它们可以绕过 shell 并直接将你的参数作为程序的参数使用。 - Linuxios
是的,关键是不要让 shell 解析它。这样太危险了。 - theglauber
没错,我相信我们是同意的。 - Linuxios

0

您可以在命令字符串中使用表达式扩展和转义序列:

lsCmd = `ls -l #{usrDirectory}`

0

你有两个选择。你可以:

lsCmd = `ls -l #{usrDirectory}`

或者

command = "ls -l " + usrDirectory
lsCmd = %x[ #{command} ]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接