7

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

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

出于安全原因,我想使用一个不使用 shell 的版本(我给出的 URL 中的第二种和第三种形式,而不是第一种)

4

1 回答 1

14

考虑以下示例:

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

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

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

第二个完全绕过外壳。它将在 中查找echoPATH然后以字符串'*'作为参数执行它。由于 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 10system('sleep 10').

如果您提供 Hash 作为第一个参数,则该 Hash 将用作衍生进程的环境变量。如果您提供一个 Hash 作为最后一个参数,那么该 Hash 将用作选项;如文档中所述,有关参数的更多system文档可在Kernel#spawn.

于 2012-11-12T04:18:19.283 回答