0

我似乎无法让文件输出正常工作:

record = File.open("/tmp/record", "w")

old_stdout = $stdout
$stdout = record
$stderr = $stdout

puts "This is a record"
z = 10/0

当我从命令行运行或撬动它时,我似乎无法将输出输出到文件中。任何想法为什么这不起作用?

4

1 回答 1

0

一个可能的问题是您没有关闭文件流。

这样做很重要,因为文件缓冲区可能尚未刷新到文件本身。因为您的代码使用零除法生成错误,Ruby 也可能没有正确关闭文件。

也就是说,您的代码可以写得更干净,更像 Ruby,而不会破坏如何puts用于写入文件:

File.open("/tmp/record", "w") do |record|
  record.puts "This is a record"
end

当块退出时,这将自动关闭文件输出。

也许您正试图捕获您正在使用生成的自诱导零除异常的输出z = 10/0

您可以通过抢救异常来做到这一点;没有它,你无法让 Ruby 继续运行:

File.open("./record", "w") do |record|

  record.puts "This is a record"

  begin
    z = 10/0
  rescue Exception => e
    record.puts e.message
  end

end

运行后,“记录”包含:

This is a record
divided by 0

或者,您可以这样做:

File.open("./record", "w") do |record|

  old_stdout, old_stderr = $stdout, $old_stderr
  $stdout = $stderr = record

  puts "This is a record"

  begin
    z = 10/0
  rescue Exception => e
    puts e.message
  end

  $stdout, $stderr = old_stdout, old_stderr
end

其中,运行后,“记录”再次包含:

This is a record
divided by 0

有时我们想通过重新分配 STDOUT 和 STDERR 来玩游戏,但总的来说,我建议不要这样做。相反,使用以下内容直接写信给他们:

$sterr.puts "foo blowed up"

这是为了使正在发生的事情更加明显,以提高可读性和可维护性。如果您已将 $stderr 重定向到一个文件,当时是凌晨 3:00,并且您正试图记住代码的作用,因为您的系统已关闭,并且您没有像预期的那样看到输出,您可能很想将代码重写为上述代码,或者破解一些强制输出您期望的东西。混乱可以从那里级联。

于 2013-09-12T19:27:31.217 回答