File :: Tee和打开管道到“tee”之间有什么区别吗?

时间:2013-07-24 11:12:59

标签: perl tee

我有一个关于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的那个?

1 个答案:

答案 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模块执行的外部程序的输出。