在Ruby脚本中重定向标准输出有问题



我有以下测试Ruby脚本:

require 'tempfile'
tempfile = Tempfile.new 'test'
$stderr.reopen tempfile
$stdout.reopen tempfile
puts 'test stdout'
warn 'test stderr'
`mail -s 'test' my@email.com < #{tempfile.path}`
tempfile.close
tempfile.unlink
$stderr.reopen STDERR
$stdout.reopen STDOUT

我收到的邮件内容是:

test stderr

为什么stderr可以正确重定向而stdout不能?

编辑:作为对评论的回应,我在puts行之后添加了$stdout.flush,并且它正确打印。所以我要重申我的问题:发生了什么,为什么冲洗修复了它?

通常对标准输出进行缓冲,以避免每次写操作都需要系统调用。所以,当你说:

puts 'test stdout'

你实际上只是把那个字符串塞进了缓冲区。然后你这样说:

`mail -s 'test' my@email.com < #{tempfile.path}`

和你的'test stdout'字符串仍然在缓冲区中,所以当mail发送文件的内容给你时,它不是在tempfile。刷新$stdout强制将缓冲区中的所有内容写入磁盘;从精细手册:

将ios中的所有缓冲数据刷新到底层操作系统(注意,这只是Ruby内部缓冲;操作系统也可以缓冲数据)。

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

生产:

no newline

标准错误通常不加缓冲,因此错误消息(应该很少)立即可见。

相关内容

  • 没有找到相关文章

最新更新