我很困惑在这里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
.