2017-11-28 3 views
1

Wenn ich diese einfache Ruby-Skript auszuführen:Locken-Befehl wird statt gespeichert in Ruby gedruckt

a = `curl localhost` 
puts "Result is: #{a}" 


=> % Total % Received % Xferd Average Speed Time Time  Time CurrentDload Upload Total Spent Left Speed 
=> 0  0 0  0 0  0  0  0 --:--:-- --:--:-- --:--:-- 0curl: (7) Failed to connect to localhost port 80: Connection refused 
=> Result is: 

Sehen Sie, dass das Ergebnis gedruckt wird, wenn der Befehl ausgeführt wird, und die Variable ist leer. Aber wenn ich anderen Befehl im gleichen Format laufen funktioniert es, wie ich erwarte:

a = `ls` 
puts "Result is: #{a}" 

=> Result is: test.rb 

Wie kann ich die Ergebnisse des ersten curl Befehls in eine Variable speichern?

Antwort

1

Von man curl:

curl zeigt normalerweise eine Fortschrittsanzeige während des Betriebs, diese Daten ist mit dem Anschluss standardmäßig angezeigt ... Wenn Sie einen Fortschritt Meter für HTTP POST wollen oder Anfragen PUT Sie muss die Antwort Ausgabe in eine Datei umleiten, mit Shell-Umleitung (>), -o, --output oder ähnlich.

Bei der Verwendung von Backticks wird nur die Standardausgabe (stdout) des Befehls ausgegeben.

Wenn Sie die Curl-Ausgabe benötigen, können Sie mit der Option -o eine Datei mit der Ausgabe erstellen, die Sie dann verwenden können, wenn Sie sie benötigen.

`curl localhost -o curl_localhost_output.txt` 
puts File.read('path-to-file/curl_localhost_output.txt') 

existiert auch „einen Weg“, um die stderr nach stdout zu umleiten, ist aber nicht auf stdout, sondern in einer Datei 1 mit dem Namen, so dass Sie curl localhost 2>&1 und speichern Sie die curl Ausgang nutzen könnten, ohne erstellen und Lese eine Datei.

+0

Vielen Dank für die Erklärung. Basierend auf den von Ihnen bereitgestellten Informationen habe ich 'a =' curl localhost 2> & 1 '' 'getestet, was so funktioniert, wie ich es erwartet habe, ohne dass ich aus einer Datei lesen muss. Können Sie das zu Ihrer Antwort hinzufügen, damit ich es akzeptieren kann? – Scotty

+0

Aktualisiert, ich wusste es nicht, jetzt mache ich, danke dafür. –

+0

'curl -s localhost' wird die Fortschrittsanzeigen stummschalten und Ihnen nur den Antworttext im stdout geben. Keine Notwendigkeit für Umleitungen Shenanigans. Außerdem "require" open-uri '; a = offen ('http: // localhost') {| f | f.read} 'ist ein reines Ruby-Äquivalent. – Amadan

Verwandte Themen