我正在编写一个 Thor 脚本来从不同的工具运行一些测试,即运行一个 shell 命令。我希望命令中的 stdout 和 stderr 不断流入我的控制台。
第一次尝试是只使用反引号,但自然不会打印标准输出/标准错误(相反,标准输出被捕获在返回值中)。
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
它看起来是不是最好和最干净的方法?我必须在标准错误之前手动尝试打印标准输出是一个问题吗?