2013-07-08 54 views
1

我有一個控制檯應用程序在通過NSLog發佈錯誤代碼的mac上。如何在ruby中運行控制檯應用程序時捕獲NSLog的結果?如何在ruby中捕獲NSLog的輸出?

我試過類似redirecting stderr的方法,但這似乎並沒有辦法。

好的,我會編輯這個清晰。

我有一個爲MacOS編寫的程序,當前通過NSLog報告它的輸出。對於所有意圖和目的,它可以只是有這條線在其main.m文件:

NSLog(@"Hello world!"); 

我要拍攝的NSLog的內容。我不能改變程序本身,我只有日誌文件。我想在Ruby中進行一些基於rspec的測試。

現在,我無法使用重定向。任何類型的重定向,如:

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

導致無輸出。如果我按照前面提到的問題所描述的那樣重新定向stderr,我仍然沒有結果。那麼我怎樣才能捕捉到程序的結果呢?我不想將它們重定向到一個文件。

+1

您需要通過顯示代碼和錯誤給我們提供更多信息。說「這似乎沒有伎倆」是非常模糊的。請參閱http://sscce.org/瞭解我們所需的信息。 –

+0

真的嗎?現在,我無法接受NSLog生成的字符串,並在紅寶石中使用它們。這是一個非常簡單的問題。沒有錯誤。 – mmr

+0

檢查http://stackoverflow.com/questions/7271528/nslog-into-file。 NSLog()通常寫入到Mac的控制檯。您可能可以將結果從'/ private/var/log/system.log'或其他日誌之一中過濾出來,但是當您可以重定向輸出時,這是一個間接路徑。 –

回答

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 

,輸出:在使用調試器或PRY看到各種輸出發生時

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 

單步。