gpt4 book ai didi

ruby - 如何使用 Ruby 将 STDOUT 复制到文件而不停止它在屏幕上显示

转载 作者:数据小太阳 更新时间:2023-10-29 06:43:58 25 4
gpt4 key购买 nike

我正在尝试将标准输出复制到一个文件以用于日志记录。我还希望它显示在我正在使用的 IDE 的 Ruby 控制台中。

我将这段代码插入到我的脚本中,它将 $stdout 重定向到 my.log 文件:

$stdout.reopen("my.log", "w")

有没有人知道将 $stdout 的内容复制到文件而不是将其重定向到文件的 gem 或技术?另外,我不使用 Rails,只使用 Ruby。

最佳答案

这样的事情可能对你有帮助:

class TeeIO < IO

def initialize orig, file
@orig = orig
@file = file
end

def write string
@file.write string
@orig.write string
end

end

IO中大部分做输出的方法最终都是使用write,所以你只需要重写这一个方法即可。你可以像这样使用它:

#setup
tee = TeeIO.new $stdout, File.new('out.txt', 'w')
$stdout = tee

# Now lots of example uses:
puts "Hello"
$stdout.puts "Extending IO allows us to expicitly use $stdout"
print "heres", :an, :example, "using", 'print', "\n"
48.upto(57) do |i|
putc i
end
putc 10 #newline
printf "%s works as well - %d\n", "printf", 42
$stdout.write "Goodbye\n"

在此示例之后,以下内容将以相同方式写入控制台和文件:

Hello
Extending IO allows us to expicitly use $stdout
heresanexampleusingprint
0123456789
printf works as well - 42
Goodbye

我不会说这种技术是万无一失的,但它应该适用于标准输出的简单使用。测试它以供您使用。

请注意,您不必在 $stdout 上使用 reopen,除非您想要重定向来自子进程或不合作扩展的输出。只需为其分配一个不同的 IO 对象即可满足大多数用途。


R规范

RSpec 命令行引用了$stdout之前你可以运行任何代码来重新分配它,所以这是行不通的。 reopen 在这种情况下仍然有效,因为您正在更改 $stdout 和 RSpec 具有的引用所指向的实际对象,但这不会为您提供输出两者。

一个解决方案是猴子补丁 $stdout 像这样:

$out_file = File.new('out.txt', 'w')

def $stdout.write string
$out_file.write string
super
end

这是可行的,但与所有猴子修补一样,要小心。使用操作系统的 tee 命令会更安全。

关于ruby - 如何使用 Ruby 将 STDOUT 复制到文件而不停止它在屏幕上显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9433924/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com