如何在 Ruby 中临时重定向 stderr?
我想在一个块的持续时间内临时重定向 Ruby 脚本中的 stderr,确保在块结束时将其重置为其原始值。
我在 ruby 文档中找不到如何做到这一点。
I'd like to temporarily redirect stderr in a Ruby script for the duration of a block, ensuring that I reset it to its original value at the end of the block.
I had trouble finding how to do this in the ruby docs.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
在 Ruby 中,
$stderr
指的是当前使用作为 stderr 的输出流,而STDERR
是默认标准错误流。可以很容易地临时将不同的输出流分配给$stderr
。现在您可以执行以下操作:
同样的原理也适用于
$stdout
和STDOUT
。In Ruby,
$stderr
refers to the output stream that is currently used as stderr, whereasSTDERR
is the default stderr stream. It is easy to temporarily assign a different output stream to$stderr
.Now you can do the following:
The same principle also works for
$stdout
andSTDOUT
.这是一个更抽象的解决方案(归功于 David Heinemeier Hansson):
用法:
Here is a more abstract solution (credit goes to David Heinemeier Hansson):
Usage:
本质上与 @molf 的答案相同,并且具有相同的用法:
它使用 StringIO 更加简洁,并将 $stderr 保留为调用 capture_stderr 之前的内容。
Essentially the same as @molf's answer, and has the same usage:
It uses StringIO very slightly more concisely, and preserves $stderr as whatever it was before capture_stderr was called.
我喜欢 StringIO 的答案。但是,如果您正在调用外部进程,并且 $stderr = StringIO.new 不起作用,您可能会将 stderr 写入临时文件:
I like the StringIO answers. But if you are calling an external process, and
$stderr = StringIO.new
doesn't work, you might write stderr out to a temporary file: