我正在尝试使用net / sftp下载文件,并将其内容作为命令行应用程序的stdin传递。我可以先将文件写入磁盘,但我宁愿避免这一步。
有没有办法控制ruby中用system()
调用的程序的输入?
答案 0 :(得分:10)
根本不要使用system
这类事情,system
最适合运行您不需要与之交谈的外部命令。
使用Open3.open3
或Open3.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并获取返回的数据。