gpt4 book ai didi

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

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

我想暂时将 $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/

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