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