net/sftpを使用してファイルをダウンロードし、その内容をコマンドラインアプリケーションの標準入力として渡そうとしています。私は最初にディスクにファイルを書き込むことでそれを行うことができますが、私はむしろそのステップを避けるでしょう。rubyでのsystem()呼び出しの入力設定
rubyでsystem()
で呼び出されたプログラムへの入力を制御する方法はありますか?
net/sftpを使用してファイルをダウンロードし、その内容をコマンドラインアプリケーションの標準入力として渡そうとしています。私は最初にディスクにファイルを書き込むことでそれを行うことができますが、私はむしろそのステップを避けるでしょう。rubyでのsystem()呼び出しの入力設定
rubyでsystem()
で呼び出されたプログラムへの入力を制御する方法はありますか?
system
はこの種のものにはまったく使用しないでください。system
は、話をする必要のない外部コマンドを実行するのに最適です。
Open3.open3
またはOpen3.open2
を使用して、外部プロセスにいくつかのパイプを開き、他のIOチャネルへの書き込みと同じようにstdin
パイプに書き込みます。処理する出力がある場合は、他の入力IOチャネルからの読み込みのように、stdout
パイプから直接読み取ることができます。
何かこれはおそらく(mu示唆されたオープンを使用して)?
contents = "Hello, World!"
open('|echo', 'w') { puts contents }
これはまた、これが「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を探します。
完璧、ありがとう! – dslh