1

現在、Ruby から Perl スクリプトを呼び出して、ターミナルにいるかのように出力し、必要に応じて入力を提供できるようにする方法を見つけようとしています。

これを実行して事後に入力を取得する方法を理解しましたが、Perl スクリプトがまだ実行中であるため、他に何も実行できません。

Perl スクリプトは編集できないことに注意してください。これらのスクリプトが提供されており、この Ruby スクリプトは、すべての Perl スクリプトを実行するプロセスを容易にし、それらが正しい順序であることを確認するために作成されています。

upgradestatus =  `#{upgradearray[arraylocation]}`

これは、これに関連する私のコードです。これを行う方法の他のいくつかのバリエーションを試みましたが、毎回同じ状況になります。スクリプトが実行を開始すると、入力が必要になるため、そのまま待機します。

4

1 に答える 1

0

%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
于 2013-01-07T21:34:08.730 に答える