当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Ruby Kernel.exec用法及代码示例


本文简要介绍ruby语言中 Kernel.exec 的用法。

用法

exec([env,] command... [,options])

通过运行给定的外部 command 替换当前进程,它可以采用以下形式之一:

exec(commandline)

传递给标准 shell 的命令行字符串

exec(cmdname, arg1, ...)

命令名称和一个或多个参数(无 shell )

exec([cmdname, argv0], arg1, ...)

命令名称,argv 和零个或多个参数(无 shell )

在第一种形式中,字符串被视为命令行,在执行之前需要进行 shell 扩展。

标准 shell 在类 Unix 系统上始终表示 "/bin/sh",否则在 Windows 及类似系统上表示 ENV["RUBYSHELL"]ENV["COMSPEC"]。该命令作为参数传递给 shell 的 "-c" 开关,COMSPEC 的情况除外。

如果第一种形式的字符串 (exec("command")) 遵循以下简单规则:

  • 没有元字符

  • 不以 shell 保留字或特殊内置字开头

  • Ruby 直接调用命令,无需 shell

您可以通过将“;” 添加到字符串来强制调用shell(因为“;” 是一个元字符)。

请注意,此行为可通过获得的 pid 观察到(spawn() 和 IO#pid 的返回值 IO.popen )是调用命令的 pid,而不是 shell。

在第二种形式(exec("command1", "arg1", ...))中,第一种形式作为命令名,其余的作为参数传递给命令,没有 shell 扩展。

第三种形式(exec(["command", "argv0"], "arg1", ...)),在命令开头开始一个二元素数组,第一个元素是要执行的命令,第二个参数作为argv[0]的值,可能会出现在进程列表中。

为了执行命令,使用了exec(2)系统调用之一,因此运行命令可能会继承原程序的一些环境(包括打开的文件说明符)。

此行为由给定的 envoptions 参数修改。有关详细信息,请参见::spawn。

如果命令执行失败(通常是 Errno::ENOENT 时未找到),则会引发 SystemCallError 异常。

此方法在exec(2) 系统调用之前根据给定的options 修改进程属性。有关给定 options 的更多详细信息,请参见::spawn。

exec(2) 系统调用失败时,修改后的属性可能会被保留。

例如,硬资源限制是不可恢复的。

如果不可接受,请考虑使用::spawn 或 Kernel#system 创建子进程。

exec "echo *"       # echoes list of files in current directory
# never get here

exec "echo", "*"    # echoes an asterisk
# never get here

相关用法


注:本文由纯净天空筛选整理自ruby-lang.org大神的英文原创作品 Kernel.exec。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。