Ruby系统方法参数

时间:2012-11-12 03:51:10

标签: ruby

我很难阅读Ruby的system方法here的文档。我不确定什么是命令,什么是选项。如果我想执行以下操作,该怎么办?

wget -pk -nd -P /public/google www.google.com

出于安全考虑,我想使用其中一个不使用shell的版本(我给的URL中的第二个和第三个表单,而不是第一个)

1 个答案:

答案 0 :(得分:12)

考虑以下示例:

system("echo *")
system("echo", "*")

第一个将字符串'echo *'传递给要解析和执行的shell;这就是system('echo *')产生与shell提示符echo *相同的输出的原因:你得到当前目录中的文件列表。相应的参数形式是:

commandline : command line string which is passed to the standard shell

第二个完全绕过shell。它将在echo中查找PATH,然后以字符串'*'作为参数执行它。由于shell扩展了通配符(至少在unixy系统上),*将保持为简单的*,您将看到*作为输出。这里相应的参数形式是:

cmdname, arg1, ... : command name and one or more arguments (no shell)

第三种形式:

[cmdname, argv0], arg1, ... : command name, argv[0] and zero or more arguments (no shell)

用于执行cmdname,但在ps列表中显示不同的名称等。您可以通过打开两个终端来查看此操作。在其中一个中打开irb并说:

system('sleep', '10')

然后快速切换到另一个并查看ps列表。你应该在那里看到sleep 10。但是,如果你将其提交给irb

system(['sleep', 'pancakes'], '10')

并查看ps列表,您会看到pancakes 10。如果您说shell -c sleep 10,则类似的双端技巧会显示system('sleep 10')

如果您提供Hash作为第一个参数,那么该Hash将用作生成进程的环境变量。如果你提供一个哈希作为最后一个参数,那么哈希被用作选项;如system文档中所述,有关参数的进一步文档可在Kernel#spawn下找到。