1

我在 Mac 上有一个控制台应用程序,它通过 NSLog 输出错误代码。在 ruby​​ 中运行控制台应用程序时,如何捕获 NSLog 的结果?

我尝试过重定向 stderr之类的方法,但这似乎不起作用。

好的,我将把它编辑得一清二楚。

我有一个为 MacOS 编写的程序,目前通过 NSLog 报告其输出。出于所有意图和目的,它只能在其main.m文件中包含以下行:

NSLog(@"Hello world!");

我想捕获该 NSLog 的内容。我无法更改程序本身,我只有日志文件。为了一些基于 rspec 的测试,我想在 Ruby 中这样做。

现在,我不能使用重定向。任何类型的重定向,如:

 @output = `#{theProgramToTest}`
 puts @output

导致没有输出。如果我按照我链接到的上一个问题中的描述进行 stderr 的重定向,我仍然没有结果。那么如何捕获程序的结果呢?我不想将它们重定向到文件。

4

1 回答 1

0

也许这会有所帮助:

require 'stringio'

str_stdout, str_stderr = (1..2).map{ StringIO.new }

puts "redirecting outputs"
old_stdout, old_stderr = $stdout, $stderr
$stdout, $stderr = str_stdout, str_stderr

STDOUT.puts "This is written to the old STDOUT"
STDERR.puts "This is written to the old STDERR"

$stdout.puts "This is written to str_stdout"
$stderr.puts "This is written to str_stderr"

puts 'this is output via "puts"'
`date`
`date >&2` # this is output to stderr

STDOUT.puts "resetting STDOUT and STDERR"

$stdout, $stderr = old_stdout, old_stderr

str_stdout.rewind
str_stderr.rewind

puts str_stdout.read
puts str_stderr.read

哪个输出:

redirecting outputs
This is written to the old STDOUT
This is written to the old STDERR
Mon Jul  8 21:51:19 MST 2013
resetting STDOUT and STDERR
This is written to str_stdout
this is output via "puts"
This is written to str_stderr

使用调试器或 PRY 查看各种输出何时发生的单步操作。

于 2013-07-09T04:52:09.627 回答