本文简要介绍ruby语言中 IO.popen
的用法。
用法
popen([env,] cmd, mode="r" [, opt]) → io
popen([env,] cmd, mode="r" [, opt]) {|io| block } → obj
将指定的命令作为子进程运行;子进程的标准输入和输出将连接到返回的 IO
对象。
启动进程的PID可以通过 IO#pid
方法得到。
cmd
是字符串或数组,如下所示。
cmd: "-" : fork commandline : command line string which is passed to a shell [env, cmdname, arg1, ..., opts] : command name and zero or more arguments (no shell) [env, [cmdname, argv0], arg1, ..., opts] : command name, argv[0] and zero or more arguments (no shell) (env and opts are optional.)
如果cmd
是String
“-
”,则启动一个新的 Ruby 实例作为子进程。
如果 cmd
是 String
的 Array
,那么它将被用作绕过 shell 的子进程的 argv
。该数组可以首先包含环境的哈希,最后包含类似于 spawn
的选项的哈希。
新文件对象的默认模式是 “r”,但 mode
可以设置为类 IO
说明中列出的任何模式。最后一个参数 opt
限定 mode
。
# set IO encoding
IO.popen("nkf -e filename", :external_encoding=>"EUC-JP") {|nkf_io|
euc_jp_string = nkf_io.read
}
# merge standard output and standard error using
# spawn option. See the document of Kernel.spawn.
IO.popen(["ls", "/", :err=>[:child, :out]]) {|ls_io|
ls_result_with_error = ls_io.read
}
# spawn options can be mixed with IO options
IO.popen(["ls", "/"], :err=>[:child, :out]) {|ls_io|
ls_result_with_error = ls_io.read
}
引发 IO.pipe
和 Kernel.spawn
引发的异常。
如果给出了一个块,Ruby 将作为通过管道连接到 Ruby 的子节点运行该命令。 Ruby 的管道末端将作为参数传递给块。在块结束时,Ruby 关闭管道并设置 $?
。在这种情况下, IO.popen
返回块的值。
如果一个块的 cmd
为“-
”,则该块将在两个单独的进程中运行:一次在父进程中,一次在子进程中。父进程将管道对象作为参数传递给块,子版本的块将传递nil
,子进程的标准输入和标准输出将通过管道连接到父进程。并非在所有平台上都可用。
f = IO.popen("uname")
p f.readlines
f.close
puts "Parent is #{Process.pid}"
IO.popen("date") {|f| puts f.gets }
IO.popen("-") {|f| $stderr.puts "#{Process.pid} is here, f is #{f.inspect}"}
p $?
IO.popen(%w"sed -e s|^|<foo>| -e s&$&;zot;&", "r+") {|f|
f.puts "bar"; f.close_write; puts f.gets
}
产生:
["Linux\n"] Parent is 21346 Thu Jan 15 22:41:19 JST 2009 21346 is here, f is #<IO:fd 3> 21352 is here, f is nil #<Process::Status: pid 21352 exit 0> <foo>bar;zot;
相关用法
- Ruby IO.pos用法及代码示例
- Ruby IO.pos =用法及代码示例
- Ruby IO.pread用法及代码示例
- Ruby IO.pwrite用法及代码示例
- Ruby IO.pathconf用法及代码示例
- Ruby IO.print用法及代码示例
- Ruby IO.pid用法及代码示例
- Ruby IO.pipe用法及代码示例
- Ruby IO.puts用法及代码示例
- Ruby IO.putc用法及代码示例
- Ruby IO.eof用法及代码示例
- Ruby IO.read用法及代码示例
- Ruby IO.fileno用法及代码示例
- Ruby IO.raw用法及代码示例
- Ruby IO.readlines用法及代码示例
- Ruby IO.to_i用法及代码示例
- Ruby IO.self << object用法及代码示例
- Ruby IO.tty?用法及代码示例
- Ruby IO.close_write用法及代码示例
- Ruby IO.write_nonblock用法及代码示例
- Ruby IO.set_encoding_by_bom用法及代码示例
- Ruby IO.syswrite用法及代码示例
- Ruby IO.close_read用法及代码示例
- Ruby IO.stat用法及代码示例
- Ruby IO.ungetc用法及代码示例
注:本文由纯净天空筛选整理自ruby-lang.org大神的英文原创作品 IO.popen。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。