【发布时间】:2011-06-27 02:32:41
【问题描述】:
我正在尝试使用 net/sftp 下载文件并将其内容作为命令行应用程序的标准输入传递。我可以先将文件写入磁盘,但我宁愿避免这一步。
有什么方法可以控制在 ruby 中使用system() 调用的程序的输入?
【问题讨论】:
我正在尝试使用 net/sftp 下载文件并将其内容作为命令行应用程序的标准输入传递。我可以先将文件写入磁盘,但我宁愿避免这一步。
有什么方法可以控制在 ruby 中使用system() 调用的程序的输入?
【问题讨论】:
不要在这种事情上使用system,system 最适合运行不需要与之交谈的外部命令。
使用Open3.open3 或Open3.open2 为您的外部进程打开一些管道,然后像写入任何其他IO 通道一样写入stdin 管道;如果有任何输出需要处理,那么您可以直接从stdout 管道读取它,就像从任何其他输入 IO 通道读取一样。
【讨论】:
可能是这样的(按照 mu 的建议使用 open)?
contents = "Hello, World!"
open('|echo', 'w') { puts contents }
【讨论】:
这也可以通过 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 显示“=>”来寻找返回的数据并获取返回的数据。
【讨论】: