首页 文章

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

提问于
浏览
-3

在Perl中是否有 simple way 将STDOUT或STDERR发送到多个地方而不使用File :: Tee或打开管道到/ usr / bin / tee?

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

  • 前叉

  • 使用File :: Tee / IO :: Tee /一些其他模块依赖项,其代码足迹比我的实际脚本大1000倍

  • 打开实际tee命令的管道

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

1 回答

  • -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行 .

    如果您正在寻找一种不是"hack"的方法,则以下内容改编自http://grokbase.com/t/perl/beginners/096pcz62bk/redirecting-stderr-with-io-tee

    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 $!;
    

相关问题