2

我有一个关于这个答案的问题,下面引用,弗里多在这里的另一个问题。(我无权对此发表评论,所以我提出这个问题。)

“您可以使用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;

这两款T恤是一样的吗?还是一个来自 Perl 而另一个来自 Linux/Unix?

4

1 回答 1

5

它们大多相同,但实现细节不同。

打开管道以tee some_file.out分叉一个新进程并在其中运行 Unix / Linux 实用程序tee(1)。该程序读取其标准输入(即您写入管道的任何内容)并将其写入some_file.out到标准输出以及标准输出(它从您的程序继承)。

显然,这在 Windows 下或任何其他不提供 Unix 风格tee命令的系统上都行不通。


另一方面,File::Tee 模块是用纯 Perl 实现的,不依赖于任何外部程序然而,根据其文档,它可以通过分叉一个新进程并在其下运行本质上是 Unixtee命令的 Perl 重新实现来工作。正如文档所述,这确实有一些优点:

“它是围绕fork实现的,为每个 tee 的流创建一个新进程。这样,处理由系统运行的外部程序或不通过perlio的 XS 模块生成的输出没有问题。”

另一方面,使用也fork有它的缺点:

“错误

不适用于 Windows(欢迎使用补丁)。”


tee如果您确实想要一个适用于所有平台的功能的纯 Perl 实现,请考虑改用IO::Tee。与 File::Tee 不同,这个模块是使用 PerlIO 实现的,而不是使用fork. 唉,这也意味着它可能无法正确捕获使用system绕过 PerlIO 的 XS 模块执行的外部程序的输出。

于 2013-07-24T13:37:05.007 回答