2012-04-30 179 views
3

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

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

我有它设置像这样:

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

我需要使用类似的ls -l usrDirectory。 我可以直接将它插入到命令中吗?

回答

2

以上是正确的,如果你想有ls输出到标准输出,这使得它干净了一点:

system("ls", "-l", dir) 

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

+3

如果你打算使用'system',你应该使用多参数版本:'system('ls','-l',dir)' –

+0

噢。我会改变这一点。谢谢你提醒我。 – Linuxios

0

您可以使用表情扩张和逃生的命令字符串序列:

lsCmd = `ls -l #{usrDirectory}` 
0

你有两种选择。你可以这样做:

lsCmd = `ls -l #{usrDirectory}` 

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

你应该能够得到你想要的东西,而不使用shell,例如:

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

p files 

不管你做什么,是非常小心将用户输入的文本作为将被解析和执行的内容的一部分传递给shell。例如,如果用户输入(而不是一个目录名)

会发生什么; RM -rf/*

+1

这就是为什么你使用这些命令的多参数版本,他们绕过了shell并直接使用你的参数作为程序的参数。 – Linuxios

+0

是的,关键是不要让shell解析它。力量太大。 – theglauber

+0

没错。我很确定我们同意。 – Linuxios