ruby-on-rails - 在 Rails 应用程序中重新定义 $stdout 和 $stderr 的副作用

标签 ruby-on-rails ruby redirect stdout stderr

我想暂时将 $stdout$stderr 重定向到将由 script/runner 运行的脚本中的文件在 Rails 应用程序中。这样做有任何潜在的副作用吗?在我的脚本运行期间,更改全局变量是否会导致输出流在 Rails 应用程序的其他部分重定向?脚本使用的其他库或线程呢?

最佳答案

标准输出和标准错误流通常可以通过两种方式访问​​:

  • $stdoutSTDOUT
  • $stderrSTDERR

足够聪明的人也可以使用 IO.new 打开他们自己的副本使用文件描述符参数:

sneaky = IO.new(2, 'w')

现在您可以通过 sneaky 对标准错误流进行写入访问与$stderr无关或 STDERR .

重新分配 $stderr$stdout应该可以正常工作,除非你的代码、gem 或 Ruby 本身正在使用常量( STDOUTSTDERR )或直接通过 C 的 stdio、unix 的低级 read 访问流。/write使用数字文件描述符或正在使用 IO.new 打开自己对流的访问权限.我没有深入研究源代码,但我怀疑分配给 $stdout会对 stdout 做任何事在 C-land 或 Unix-land 中的文件描述符 1。

如果您真的需要捕获标准输出和错误流,那么您最好编写一个包装器 shell 脚本来为您重定向流。


更新:如果您主要(仅?)关心更改 $stdout$stderr在你的里面script/runner渗入你的 Rails 应用程序的其余部分,那么你就不必担心了。每个进程——你的script/runner process 以及您的主应用程序运行的许多服务器进程 - 获得自己的一组全局变量,因此您可以在脚本中随意更改它们,而不会弄乱您的主应用程序。当然,您仍然需要担心使用 STDOUT 的 gem 。而不是 $stderr或使用 IO.new推出自己的私有(private)标准。

关于ruby-on-rails - 在 Rails 应用程序中重新定义 $stdout 和 $stderr 的副作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6682116/

相关文章:

ruby-on-rails - 如何允许数组具有强参数

ruby-on-rails - 测试一条路线时 Rspec 未定义方法 `route_to'?

html - rails -nokogiri GEM : Detect MIME type of image in URL

wordpress - wordpress .htaccess 中的文件夹索引

c - 外壳管道和重定向帮助。错误 : Must set personality to get -x option/Garbage option

ruby-on-rails - Rails has_one vs belongs_to 语义

ruby-on-rails - Rails 4.1 中的 Assets 压缩

ruby-on-rails - 我怎样才能以 ruby 开始当前的工作日?

ruby-on-rails - 需要帮助最大化多个相似对象中的 3 个因素并适当排序

wordpress - 通过 htaccess 将旧域的子目录重定向到新域的根文件夹