gpt4 book ai didi

perl - File::Tee 和打开到 "tee"的管道有什么区别吗?

转载 作者:行者123 更新时间:2023-12-02 21:55:48 25 4
gpt4 key购买 nike

我有一个关于 this answer 的问题,如下引用,由 friedo 回答此处的另一个问题。 (我无权对此发表评论,所以我将其作为一个问题提出。)

"You can use File::Tee.

use File::Tee qw(tee);
tee STDOUT, '>>', 'some_file.out';
print "w00p w00p";

If File::Tee is unavailable, it is easily simulated with a pipeline:

open my $tee, "|-", "tee some_file.out";
print $tee "w00p w00p";
close $tee;

这两个 T 恤是一样的吗?或者一个来自 Perl,另一个来自 Linux/Unix?

最佳答案

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

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

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


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

"It is implemeted around fork, creating a new process for every tee'ed stream. That way, there are no problems handling the output generated by external programs run with system or by XS modules that don't go through perlio."

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

"BUGS

Does not work on Windows (patches welcome)."


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

关于perl - File::Tee 和打开到 "tee"的管道有什么区别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17832329/

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