48

Rubyから(シェル)コマンドを実行して出力を表示するだけでなくキャプチャする方法はありますか? 多分いくつかの宝石の助けを借りて?

表示とは、最後に表示するのではなく、表示されるとおりに表示することを意味します。したがって、ユーザーは、遅いコマンドを実行しているときに何が起こっているかについてのフィードバックを得ることができます。

4

4 に答える 4

79

次のようにシステムコールを実行できます。

`sleep --help`

または、このように

system "sleep --help"

または

%x{ sleep --help }

system出力を出力して or を返すtrue場合、nil他の 2 つのメソッドは出力を返します。

PSああ。リアルタイム表示についてです。

そう。次のようなものを使用できます。

system("ruby", "-e 100.times{|i| p i; sleep 1}", out: $stdout, err: :out)

データをリアルタイムで出力して変数に保存するには:

output = []
r, io = IO.pipe
fork do
  system("ruby", "-e 3.times{|i| p i; sleep 1}", out: io, err: :out)
end
io.close
r.each_line{|l| puts l; output << l.chomp}
#=> 0
#=> 1
#=> 2
p output
#=> ['0', '1', '2']

または使用popen

output = []
IO.popen("ruby -e '3.times{|i| p i; sleep 1}'").each do |line|
  p line.chomp
  output << line.chomp
end
#=> '0'
#=> '1'
#=> '2'
p output
#=> ['0', '1', '2']
于 2012-04-19T08:49:21.697 に答える
15

出力をリダイレクトできます

system 'uptime > results.log'

または結果を保存します。

result = `uptime`
result = %x[uptime]

ここを参照してください。進行状況の情報や出力をリアルタイムで取得するのはもっと複雑です。単純な解決策があるとは思えません。Open3.popen3などの高度なプロセス管理機能で可能かもしれません。ptyで疑似端末を使用して、そこで出力を取得することもできます。

于 2012-04-19T08:51:59.013 に答える