%x
サブコマンドの出力の出力を監視する機能がないため、バッククォートを使用して、または通常のサブシェルとして、必要なことを行うことはできません。
Open3popen2
またはpopen3
メソッドを使用して実行できます。呼び出されたプログラムの STDIN ストリームに送信し、STDOUT からデータを受信できます。popen3
また、STDOUT ストリームも表示/キャプチャできます。残念ながら、呼び出されたプログラムがその情報を返す前に、STDIN ストリームを送信して閉じなければならないことがよくあります。これは、Perl スクリプトの場合かもしれません。
さらに制御が必要な場合は、Ruby の組み込みPty
モジュールの使用を検討してください。スクリプト メカニズムを介して実行中のアプリと対話できるように設計されています。プロンプトを探すようにコードを設定し、適切なデータを送り返すことで応答する必要があります。話しているコードに応じて、単純な場合もあれば、主要な PITA になる場合もあります。
これはopen
コマンドの例です:
PTY.open {|m, s|
p m #=> #<IO:masterpty:/dev/pts/1>
p s #=> #<File:/dev/pts/1>
p s.path #=> "/dev/pts/1"
}
# Change the buffering type in factor command,
# assuming that factor uses stdio for stdout buffering.
# If IO.pipe is used instead of PTY.open,
# this code deadlocks because factor's stdout is fully buffered.
require 'io/console' # for IO#raw!
m, s = PTY.open
s.raw! # disable newline conversion.
r, w = IO.pipe
pid = spawn("factor", :in=>r, :out=>s)
r.close
s.close
w.puts "42"
p m.gets #=> "42: 2 3 7\n"
w.puts "144"
p m.gets #=> "144: 2 2 2 2 3 3\n"
w.close
# The result of read operation when pty slave is closed is platform
# dependent.
ret = begin
m.gets # FreeBSD returns nil.
rescue Errno::EIO # GNU/Linux raises EIO.
nil
end
p ret #=> nil