你不能用反引號%x
或者作爲普通的子shell來做你想做的事情,因爲他們缺乏觀察子命令輸出輸出的能力。
你可以使用Open3的popen2
或popen3
方法。他們讓你發送到被叫節目的STDIN流,並從STDOUT接收數據。 popen3
也可以讓你看到/捕獲標準輸出流。不幸的是,在被調用的程序返回它的信息之前,通常你必須發送,然後關閉STDIN流,這可能是Perl腳本的情況。
如果您需要更多控制,請使用Ruby的內置Pty
模塊進行調查。它旨在讓您通過腳本機制與正在運行的應用程序交談。您必須設置代碼來查找提示,然後通過發回適當的數據來回應它們。它可以很簡單,也可以是一個主要的PITA,具體取決於你所說的代碼。
這是open
命令的例子:
PTY.open {|m, s|
p m #=> #<IO:masterpty:/dev/pts/1>
p s #=> #<File:/dev/pts/1>
p s.path #=> "/dev/pts/1"
}
# Change the buffering type in factor command,
# assuming that factor uses stdio for stdout buffering.
# If IO.pipe is used instead of PTY.open,
# this code deadlocks because factor's stdout is fully buffered.
require 'io/console' # for IO#raw!
m, s = PTY.open
s.raw! # disable newline conversion.
r, w = IO.pipe
pid = spawn("factor", :in=>r, :out=>s)
r.close
s.close
w.puts "42"
p m.gets #=> "42: 2 3 7\n"
w.puts "144"
p m.gets #=> "144: 2 2 2 2 3 3\n"
w.close
# The result of read operation when pty slave is closed is platform
# dependent.
ret = begin
m.gets # FreeBSD returns nil.
rescue Errno::EIO # GNU/Linux raises EIO.
nil
end
p ret #=> nil
你的問題需要更清晰。也許你應該告訴我們你做了什麼或者發佈了僞代碼,以便我們看到你期望的輸入,輸出和控制流。 – sunnyrjuneja
子進程通常會繼承父進程的句柄,包括STDIN。這足夠好嗎? – ikegami
你可以使用[this](http://stackoverflow.com/questions/3159945/running-command-line-commands-within-ruby-script)來從命令行調用perl嗎? – sunnyrjuneja