我很困惑在这里system阅读 Ruby方法的文档。我不确定什么是命令,什么是选项。如果我想执行以下操作,我该怎么办?
wget -pk -nd -P /public/google www.google.com
出于安全原因,我想使用一个不使用 shell 的版本(我给出的 URL 中的第二种和第三种形式,而不是第一种)
考虑以下示例:
system("echo *")
system("echo", "*")
第一个将字符串传递'echo *'给shell进行解析和执行;这就是为什么system('echo *')会产生与 shell 提示符相同的输出echo *:您将获得当前目录中的文件列表。对应的参数形式为:
commandline : command line string which is passed to the standard 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 将用作衍生进程的环境变量。如果您提供一个 Hash 作为最后一个参数,那么该 Hash 将用作选项;如文档中所述,有关参数的更多system文档可在Kernel#spawn.