为ruby中的system()调用设置输入

时间:2011-06-27 02:32:42

标签: ruby system

我正在尝试使用net / sftp下载文件,并将其内容作为命令行应用程序的stdin传递。我可以先将文件写入磁盘,但我宁愿避免这一步。

有没有办法控制ruby中用system()调用的程序的输入?

3 个答案:

答案 0 :(得分:10)

根本不要使用system这类事情,system最适合运行您不需要与之交谈的外部命令。

使用Open3.open3Open3.open2向外部进程打开一些管道,然后写入stdin管道,就像写入任何其他IO通道一样;如果有任何输出要处理,那么你可以直接从stdout管道读取它,就像从任何其他输入IO通道读取一样。

答案 1 :(得分:2)

这样的事情或许(使用open建议的mu)?

contents = "Hello, World!"
open('|echo', 'w') { puts contents }

答案 2 :(得分:2)

这也可以通过IO.expect

来完成
require 'pty'
require 'expect'

str = "RUBY_VERSION"

PTY.spawn("irb") do |reader, writer|
  reader.expect(/0> /)
  writer.puts(str)
  reader.expect(/=> /)
  answer = reader.gets
  puts "Ruby version from irb: #{answer}"
end

等待生成的进程显示“0>”(irb提示符的结束)以及何时看到它打印出已定义的字符串。然后它通过等待它显示“=>”来查找返回的irb并获取返回的数据。