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


Ruby IO.popen用法及代码示例


本文简要介绍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.)

如果cmdString-”,则启动一个新的 Ruby 实例作为子进程。

如果 cmdStringArray ,那么它将被用作绕过 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-lang.org大神的英文原创作品 IO.popen。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。