Esecuzione di un comando da Ruby che visualizza e cattura l’output

C’è un modo per eseguire un comando (shell) dalla visualizzazione di Ruby ma anche catturare l’output? Forse con l’aiuto di qualche gem?

Quello che intendo visualizzando non è la stampa alla fine, ma come appare, così l’utente ottiene il feedback di ciò che sta succedendo quando esegue comandi lenti.

È ansible eseguire la chiamata di sistema in questo modo:

`sleep --help` 

O come questo

 system "sleep --help" 

O

 %x{ sleep --help } 

In caso di system stamperà l’output e restituirà true o nil , altri due metodi restituiranno l’output

PS Oh. Si tratta di visualizzare in tempo reale.

Così. Potresti usare qualcosa come questo:

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

Per stampare i dati in tempo reale e memorizzarli in variabili:

 output = [] r, io = IO.pipe fork do system("ruby", "-e 3.times{|i| pi; 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'] 

O usa il popen

 output = [] IO.popen("ruby -e '3.times{|i| pi; sleep 1}'").each do |line| p line.chomp output << line.chomp end #=> '0' #=> '1' #=> '2' p output #=> ['0', '1', '2'] 

È ansible redirect l’output

 system 'uptime > results.log' 

o salvare i risultati.

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

guarda qui Ottenere informazioni di progresso o output in tempo reale è più complicato, dubito che ci sia una soluzione semplice. Forse è ansible con funzioni avanzate di gestione dei processi come Open3.popen3 . Potresti anche provare a usare uno pseudo terminale con pty e generare l’output lì .

Ho usato open3 per catturare l’output del comando shell eseguito dal codice ruby.

 require 'open3' stdout, stdeerr, status = Open3.capture3("ls") puts stdout 

Se si desidera esplorare una soluzione al di fuori della libreria standard, è ansible utilizzare anche Mixlib::ShellOut per eseguire l’output del stream e acquisirlo:

 require 'mixlib/shellout' cmd = 'while true; do date; sleep 2; done' so = Mixlib::ShellOut.new(cmd) so.live_stream = $stdout so.run_command out = so.stdout