只需穿上Perl,不用叉子,File :: Tee或T恤管道

时间:2016-04-28 18:07:05

标签: perl

在Perl中是否有简单方法将STDOUT或STDERR发送到多个地方而不用分叉,使用File :: Tee,或者打开管道到/ usr / bin / tee?

当然有一种方法可以在纯perl 中执行此操作,而无需编写20多行代码,对吧?我错过了什么?在SO和其他地方都提出了类似的问题,但没有一个答案符合我不需要的要求

  • fork
  • 使用File :: Tee / IO :: Tee /其他一些模块+依赖项 其代码占用量比我的实际脚本大1000倍
  • 打开实际三通命令的管道

我可以在这里看到使用核心模块作为权衡,但真的需要吗?

1 个答案:

答案 0 :(得分:-1)

看起来我可以这样做:

BEGIN {
  open my $log, '>>', 'error.log' or die $!;

  $SIG{__WARN__} = sub { print $log @_ and print STDERR @_ };

  $SIG{__DIE__} = sub { warn @_ and exit 1 };
}

这简单而有效地将大多数错误消息发送到原始STDERR和日志文件(显然,陷入eval的东西没有出现,我被告知)。因此,评论中提到了这方面的缺点。但正如原始问题所述,需求是具体的。这不是为了重用。这是一个简单的小脚本,永远不会超过100行。

如果您正在寻找一种不是“黑客”的方法,那么以下内容改编自native Windows APIs

use IO::Tee;

open my $save_stderr, '>&STDERR' or die $!;

close STDERR;

open my $error_log, '>>', 'error.log' or die $!;

*STDERR = IO::Tee->new( $save_stderr, $error_log ) or die $!;