我该如何在Perl脚本中将STDOUT
流重定向到两个文件(副本)中?目前我只是将其流式传输到单个日志文件中:
open(STDOUT, ">$out_file") or die "Can't open $out_file: $!\n";
我需要做哪些更改?谢谢。
IO::Tee
。use strict;
use warnings;
use IO::Tee;
open(my $fh1,">","tee1") or die $!;
open(my $fh2,">","tee2") or die $!;
my $tee=IO::Tee->new($fh1,$fh2);
select $tee; #This makes $tee the default handle.
print "Hey!\n"; #Because of the select, you don't have to do print $tee "Hey!\n"
是的,输出结果正常:
> cat tee1
Hey!
> cat tee2
Hey!
使用tee
PerlIO层。
use PerlIO::Util;
*STDOUT->push_layer(tee => "/tmp/bar");
print "data\n";
$ perl tee_script.pl > /tmp/foo
$ cat /tmp/foo
data
$ cat /tmp/bar
data
$ perl -le 'print "Hello, world"' | tee /tmp/foo /tmp/bar Hello, world $ cat /tmp/foo /tmp/bar Hello, world Hello, world为了在程序内设置这种复制,需要将
STDOUT
与外部的tee进程建立一个管道。通过向open
传递"|-"
来轻松完成此操作。#! /usr/bin/env perl
use strict;
use warnings;
my @copies = qw( /tmp/foo /tmp/bar );
open STDOUT, "|-", "tee", @copies or die "$0: tee failed: $!";
print "Hello, world!\n";
close STDOUT or warn "$0: close: $!";
演示:
$ ./stdout-copies-demo 你好,世界! $ cat /tmp/foo /tmp/bar 你好,世界! 你好,世界!
perl ... | tell /tmp/foo > /tmp/bar
- ikegami
STDOUT
(...用什么替换?0_o)。OP想要“将STDOUT
流重定向到两个文件”。 - user554546select
选择$tee
,$tee
将成为默认句柄。TIMTOWTDI,无论您喜不喜欢。 - user554546->new($fh1,$fh2)
应该改为->new($fh1,\*STDOUT)
。 - ikegami