我想暂时将 $stdout
和 $stderr
重定向到将由 script/runner
运行的脚本中的文件在 Rails 应用程序中。这样做有任何潜在的副作用吗?在我的脚本运行期间,更改全局变量是否会导致输出流在 Rails 应用程序的其他部分重定向?脚本使用的其他库或线程呢?
最佳答案
标准输出和标准错误流通常可以通过两种方式访问:
-
$stdout
和STDOUT
-
$stderr
和STDERR
足够聪明的人也可以使用 IO.new
打开他们自己的副本使用文件描述符参数:
sneaky = IO.new(2, 'w')
现在您可以通过 sneaky
对标准错误流进行写入访问与$stderr
无关或 STDERR
.
重新分配 $stderr
和 $stdout
应该可以正常工作,除非你的代码、gem 或 Ruby 本身正在使用常量( STDOUT
、 STDERR
)或直接通过 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/