本文简要介绍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)
系统调用之一,因此运行命令可能会继承原程序的一些环境(包括打开的文件说明符)。
此行为由给定的 env
和 options
参数修改。有关详细信息,请参见::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 Kernel.exit!用法及代码示例
- Ruby Kernel.exit用法及代码示例
- Ruby Kernel.eval用法及代码示例
- Ruby Kernel.local_variables用法及代码示例
- Ruby Kernel.Integer用法及代码示例
- Ruby Kernel.binding用法及代码示例
- Ruby Kernel.frozen?用法及代码示例
- Ruby Kernel.`cmd`用法及代码示例
- Ruby Kernel.autoload用法及代码示例
- Ruby Kernel.loop用法及代码示例
- Ruby Kernel.Hash用法及代码示例
- Ruby Kernel.caller用法及代码示例
- Ruby Kernel.set_trace_func用法及代码示例
- Ruby Kernel.trap用法及代码示例
- Ruby Kernel.String用法及代码示例
- Ruby Kernel.select用法及代码示例
- Ruby Kernel.syscall用法及代码示例
- Ruby Kernel.then用法及代码示例
- Ruby Kernel.sprintf用法及代码示例
- Ruby Kernel.Pathname用法及代码示例
- Ruby Kernel.srand用法及代码示例
- Ruby Kernel.yield_self用法及代码示例
- Ruby Kernel.BigDecimal用法及代码示例
- Ruby Kernel.raise用法及代码示例
- Ruby Kernel.test用法及代码示例
注:本文由纯净天空筛选整理自ruby-lang.org大神的英文原创作品 Kernel.exec。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。