當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。