2012-04-19 17 views
38

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

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

答えて

68

あなたは、このようなシステムコールを実行することができます

`sleep --help` 

それともsystemの場合には、この

system "sleep --help" 

それとも

%x{ sleep --help } 

のように、それは出力を印刷し、trueまたはnilを返しますが、他の2つのメソッドは出力を返します

PSああ。リアルタイムで表示することです。

So.

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'] 
+1

私はコマンドを実行する方法を知っていますが、それらのどれもが文字列に出力をキャプチャして同時に出力しません。 – Pablo

+0

私はそれを今すぐ理解しています:)答えを更新しようとしています – fl00r

+0

@J.PabloFernández、チェックアウト更新 – fl00r

12

を使用

system 'uptime > results.log' 

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

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

hereを参照してください。進行状況の情報やoutput in realtimeの取得はもっと複雑ですが、私は単純な解決策があるのか​​疑問です。おそらく、Open3.popen3のような高度なprocess management functionsで可能です。 pseudo terminal with ptygrap the output thereを使用することもできます。

+0

どのようなアイデア。ありがとう... – KULKING

+0

ありがとうございます。助けて頂きました。 'puts result'という行を追加するだけです。結果はコンソールに表示されます。 –

7

私はopen3を使って、実行されたシェルコマンドの出力をルビコードから取得しました。

require 'open3' 

stdout, stdeerr, status = Open3.capture3("ls") 

puts stdout 
関連する問題