我有一个关于this answer的问题,下面引用了 friedo 到另一个问题。 (我无权对此发表评论,所以我问这是一个问题。)
“您可以使用File::Tee。
use File::Tee qw(tee); tee STDOUT, '>>', 'some_file.out'; print "w00p w00p";
如果
File::Tee
不可用,则可以使用管道轻松模拟:open my $tee, "|-", "tee some_file.out"; print $tee "w00p w00p"; close $tee;
这两种发球台都是一样的吗?或者是来自Perl的,还有来自Linux / Unix的那个?
答案 0 :(得分:5)
他们大部分相同,但实施细节不同。
打开管道到tee some_file.out
分叉一个新进程并在其中运行Unix / Linux实用程序tee(1)
。该程序读取其标准输入(即您写入管道的任何内容)并将其写入some_file.out
以及stdout(它从您的程序继承)。
显然,这不适用于Windows或任何其他不提供Unix风格的tee
命令的系统。
另一方面,File::Tee模块是用纯Perl实现的,不依赖于任何外部程序。但是,根据其文档,它也通过分支新进程并运行本质上是在其下的Unix tee
命令的Perl重新实现来工作。这确实有一些优点,正如文档所述:
“它是围绕fork实现的,为每个tee'ed流创建一个新进程。这样,处理由system或XS模块运行的外部程序生成的输出没有问题不经过perlio。“
另一方面,fork
的使用也有其缺点:
“臭虫
在Windows上不起作用(欢迎使用补丁)。“
如果您确实需要适用于所有平台的tee
功能的纯Perl实现,请考虑使用IO::Tee。与File :: Tee不同,此模块使用PerlIO实现,不使用fork
。
唉,这也意味着它可能无法正确捕获用system
或绕过PerlIO的XS模块执行的外部程序的输出。