Стандартный вывод обычно буферизируется, чтобы избежать системного вызова для каждой записи.Итак, когда вы говорите это:
puts 'test stdout'
На самом деле вы просто вставляете эту строку в буфер.Затем вы говорите следующее:
`mail -s 'test' my@email.com < #{tempfile.path}`
, и ваша строка 'test stdout'
все еще находится в буфере, поэтому ее нет в tempfile
, когда mail
отправляет вам содержимое файла.Сброс $stdout
заставляет все в буфере записываться на диск;из тонкого руководства :
Сбрасывает любые буферизованные данные в ios в базовую операционную систему (обратите внимание, что это только внутренняя буферизация Ruby; ОС также может буферизовать данные).
$stdout.print "no newline"
$stdout.flush
производит:
no newline
Стандартная ошибка часто не буферизуется, поэтому сообщения об ошибках (которые должны быть редкими) видны сразу.