我正在編寫一個Thor腳本來運行來自其他工具的一些測試,即運行shell命令。我希望命令中的stdout和stderr能夠持續流入我的控制檯。Thor:運行命令時未捕獲stdout或stderr,並且出錯失敗
首先嚐試使用反引號,但stdout/stderr自然不會被打印出來(而是在返回值中捕獲stdout)。
desc "mytask", "my description"
def mytask
`run-my-tests.sh`
end
我的下一個方法是使用Open3爲:
require "open3"
desc "mytask", "my description"
def mytask
Open3.popen3("run-my-tests.sh") do |stdin, stdout, stderr|
STDOUT.puts(stdout.read())
STDERR.puts(stderr.read())
end
end
然而,上述方法將得到stdout和stderr輸出全,只在最後打印。在我的使用案例中,我寧願看到失敗的輸出,並在測試可用時通過測試。
從http://blog.bigbinary.com/2012/10/18/backtick-system-exec-in-ruby.html,我看到我們可以通過塊讀取流,即使用gets()
而不是read()
。例如:
require "open3"
desc "mytask", "my description"
def mytask
Open3.popen3(command) do |stdin, stdout, stderr|
while (out = stdout.gets()) || err = (stderr.gets())
STDOUT.print(out) if out
STDERR.print(err) if err
end
exit_code = wait_thr.value
unless exit_code.success?
raise "Failure"
end
end
end
它看起來像最好和最乾淨的方法?是否需要手動嘗試在 stderr之前打印標準輸出?
您應該使用'IO.select'來監視標準輸出和標準錯誤。 – Stefan