如果我在Ruby语言中使用Kernel#system调用一个命令,我如何获得它的输出?
system("ls")发布于 2013-05-17 06:47:48
虽然使用反引号或popen通常是你真正想要的,但它实际上并没有回答所提出的问题。捕获system输出可能有合理的理由(可能是为了自动化测试)。我在谷歌上搜索了一下turned up an answer,我想我应该把它贴在这里,以便于其他人受益。
因为我需要这个来测试,所以我的示例使用一个块设置来捕获标准输出,因为实际的system调用隐藏在被测试的代码中:
require 'tempfile'
def capture_stdout
stdout = $stdout.dup
Tempfile.open 'stdout-redirect' do |temp|
$stdout.reopen temp.path, 'w+'
yield if block_given?
$stdout.reopen stdout
temp.read
end
end此方法使用tempfile存储实际数据来捕获给定块中的任何输出。示例用法:
captured_content = capture_stdout do
system 'echo foo'
end
puts captured_content您可以用内部调用system的任何内容替换system调用。如果需要,您还可以使用类似的方法来捕获stderr。
https://stackoverflow.com/questions/690151
复制相似问题