Rubyの表示から(シェル)コマンドを実行する方法はありますか?おそらく、いくつかの宝石の助けを借りて?Rubyからコマンドを表示して出力をキャプチャする
私が表示することは、最後に印刷するのではなく、表示されるので、遅いコマンドを実行しているときに何が起こっているのかのフィードバックをユーザが得ます。
Rubyの表示から(シェル)コマンドを実行する方法はありますか?おそらく、いくつかの宝石の助けを借りて?Rubyからコマンドを表示して出力をキャプチャする
私が表示することは、最後に印刷するのではなく、表示されるので、遅いコマンドを実行しているときに何が起こっているのかのフィードバックをユーザが得ます。
あなたは、このようなシステムコールを実行することができます
`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']
を使用
system 'uptime > results.log'
または結果を保存します。
result = `uptime`
result = %x[uptime]
hereを参照してください。進行状況の情報やoutput in realtimeの取得はもっと複雑ですが、私は単純な解決策があるのか疑問です。おそらく、Open3.popen3のような高度なprocess management functionsで可能です。 pseudo terminal with ptyとgrap the output thereを使用することもできます。
どのようなアイデア。ありがとう... – KULKING
ありがとうございます。助けて頂きました。 'puts result'という行を追加するだけです。結果はコンソールに表示されます。 –
私はopen3
を使って、実行されたシェルコマンドの出力をルビコードから取得しました。
require 'open3'
stdout, stdeerr, status = Open3.capture3("ls")
puts stdout
私はコマンドを実行する方法を知っていますが、それらのどれもが文字列に出力をキャプチャして同時に出力しません。 – Pablo
私はそれを今すぐ理解しています:)答えを更新しようとしています – fl00r
@J.PabloFernández、チェックアウト更新 – fl00r