2011-07-14 3 views
2

У меня есть следующий тест на Ruby скрипт:Проблема Перенаправление стандартный вывод в Ruby, сценарий

require 'tempfile' 

tempfile = Tempfile.new 'test' 
$stderr.reopen tempfile 
$stdout.reopen tempfile 

puts 'test stdout' 
warn 'test stderr' 
`mail -s 'test' [email protected] < #{tempfile.path}` 

tempfile.close 
tempfile.unlink 
$stderr.reopen STDERR 
$stdout.reopen STDOUT 

электронной почты, который я получаю имеет содержание:

test stderr 

Почему STDERR переадресацией правильно, но не стандартный вывод?

Edit: В ответ на комментарий я добавил $stdout.flush после puts линии и распечатана правильно. Поэтому я повторю свой вопрос: что происходит и почему флеш исправляет это?

+0

Что происходит, когда вы переключаете порядок предупреждения и помещает? –

+0

Ничего не происходит, когда я переключаю порядок 'warn' и' puts'. @mu: я изменил 'mail' на' cat' точно так же, как вы написали, и я до сих пор не печатаю stdout. Я использую Ruby Enterprise Edition 2011.01 на CentOS Linux. – jrdioko

+0

@mu: Смотрите мое редактирование. – jrdioko

ответ

4

Стандартный вывод обычно буферизуется, чтобы избежать системного вызова для каждой записи. Итак, когда вы это говорите:

puts 'test stdout' 

Вы на самом деле просто набиваете эту строку в буфер. Тогда вы говорите, это:

`mail -s 'test' [email protected] < #{tempfile.path}` 

и ваша 'test stdout' строка еще находится в буфере, так что не в tempfile когда mail отправляет содержимое файла к вам. Промывка $stdout заставляет все в буфере записывать на диск; от fine manual:

Очищает любые буферизованные данные в пределах КСН базовой операционной системы (обратите внимание, что это только Рубин внутренней буферизации; ОС может буферизовать данные, а).

$stdout.print "no newline" 
$stdout.flush 

производит:

no newline 

Стандартная ошибка часто небуферизован так что сообщения об ошибках (которые должны быть редки) видны сразу.

+0

Интересно, и хорошая точка буферизации stderr. Я опубликовал [связанный вопрос] (http://stackoverflow.com/questions/6701103/understanding-ruby-and-os-i-o-buffering), чтобы понять все это лучше. – jrdioko

Смежные вопросы