我要執行從Ruby腳本shell命令,但我必須檢索輸出,這樣我可以在腳本以後使用它。在Ruby中從「system」命令返回輸出?
這裏是我的代碼:
output = system "heroku create" # => true
但是系統命令返回一個布爾值,而不是輸出。
簡單地說,系統「的Heroku打造」具有輸出到我的屏幕(這它),而且還返回輸出,所以我可以處理它。
我要執行從Ruby腳本shell命令,但我必須檢索輸出,這樣我可以在腳本以後使用它。在Ruby中從「system」命令返回輸出?
這裏是我的代碼:
output = system "heroku create" # => true
但是系統命令返回一個布爾值,而不是輸出。
簡單地說,系統「的Heroku打造」具有輸出到我的屏幕(這它),而且還返回輸出,所以我可以處理它。
是否與%x(「heroku create」)相同? – 2010-08-28 08:17:02
@ajsie根據手冊「內置的語法'%×{...}'使用此方法。」 – NullUserException 2010-08-28 08:20:25
http://mentalized.net/journal/2010/03/08/5_ways_to_run_commands_from_ruby/ – tokland 2010-08-28 08:21:31
的Open3庫爲您提供了完全訪問標準的IO流(STDIN,STDOUT和STDERR)。 這是紅寶石的一部分,所以沒有必要安裝一個寶石:
require 'open3'
stdin, stdout, stderr = Open3.popen3("heroku create")
puts stdout.read
stdin.close; stdout.close; stderr.close
,或者您可以使用它隱含關閉流以塊的形式:
require 'open3'
Open3.popen3("heroku create") do |stdin, stdout, stderr|
puts stdout.read
end
見Open3 documentation的全部細節。
編輯:增加了額外的流成交明細。謝謝克里斯託弗和格雷戈裏。
你不應該「關閉」這些?我正在尋找這方面的文檔,並且沒有任何例子顯示您是否需要。 (對不起:蟒,C#,C++背景,所有這些需要的您使用備用語法或手動關閉流)。 – Crisfole 2013-02-15 14:09:19
你說得對,@ChristopherPfohl:從文檔,'標準輸入/輸出/ err.close#標準輸入,輸出和錯誤應明確在此form.'關閉。但是,您也可以使用將自動關閉的塊表單。 – gregoltsov 2013-09-30 10:48:40
查看http://stackoverflow.com/questions/690151/getting-output-of-system-calls-in-ruby – weakish 2015-01-03 13:25:23