2011-06-27 4 views
4

net/sftpを使用してファイルをダウンロードし、その内容をコマンドラインアプリケーションの標準入力として渡そうとしています。私は最初にディスクにファイルを書き込むことでそれを行うことができますが、私はむしろそのステップを避けるでしょう。ruby​​でのsystem()呼び出しの入力設定

ruby​​でsystem()で呼び出されたプログラムへの入力を制御する方法はありますか?

答えて

10

systemはこの種のものにはまったく使用しないでください。systemは、話をする必要のない外部コマンドを実行するのに最適です。

Open3.open3またはOpen3.open2を使用して、外部プロセスにいくつかのパイプを開き、他のIOチャネルへの書き込みと同じようにstdinパイプに書き込みます。処理する出力がある場合は、他の入力IOチャネルからの読み込みのように、stdoutパイプから直接読み取ることができます。

+0

完璧、ありがとう! – dslh

2

何かこれはおそらく(mu示唆されたオープンを使用して)?

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

これはまた、これが「0>」(IRBプロンプトの端部)を表示するために生成されたプロセスを待ち、それはそれがAプリント見たとき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 

を用いて達成することができます定義された文字列。次に、irbが "=>"を表示し、返されたデータを取得するのを待って、返すirbを探します。

関連する問題