2016-03-17 102 views
2

在Ruby中,我使用反引號來執行(許多)shell命令。如何獲取控制檯上顯示的shell命令輸出?Ruby - 在控制檯上顯示反向輸出

更詳細一點。如果我運行類似以下的(ansible)命令,我得到很多在控制檯上滾動的輸出的

% ansible-playbook config.yml -e foo=bar -e baz=qux 

PLAY [base setup] ************************************************************** 

TASK [setup] ******************************************************************* 
ok: [10.99.66.210] 

... etc, etc 

但是如果我執行從紅寶石相同的命令(反引號使用),我沒有看到任何輸出在控制檯上:

# cmd = ansible-playbook config.yml -e foo=bar -e baz=qux 
`#{cmd}` 

這是不幸的,因爲我希望看到輸出爲了調試。我可以將Ruby腳本的輸出重定向到一個(尾)日誌文件,但我希望看到輸出發生。

+1

我不認爲你需要插值'和'#cmd' {}' – marcosbeirigo

+1

您需要'放置\'#{cmd} \'',但我不確定它是否會在完成之前顯示任何內容。否則,請使用[popen3](http://ruby-doc.org/stdlib-2.0.0/libdoc/open3/rdoc/Open3.html#method-c-popen3) –

回答

1

由於David K-J的評論,以及Ruby—Open3.popen3

對我來說,解決辦法是Open3#popen2e,例如:

# cmd = ansible-playbook config.yml -e foo=bar -e baz=qux 
puts cmd 
if execute then 
    puts "Executing..." 
    Dir.chdir("..") do 
    Open3.popen2e(cmd) do |i,oe,t| 
     oe.each { |line| puts line } 
    end 
    end 
end