作者frank1983 (What?)
看板Perl
标题Re: [问题] 请教如何实现下边这种重定向﹖
时间Sat May 14 02:37:40 2011
※ 引述《herolee (hero)》之铭言:
: 1、首先希望把标准错误能够重定向到标准输出﹐类似shell的 2>&1
您可以使用 open STDERR, ">&STDOUT"
(请参考
http://perldoc.perl.org/functions/open.html )
: 2、希望能把所有标准输出(已包含标准错误的内容)在屏幕打印的同时﹐
: 也输出到某个文件中。
: 请问﹐上述功能用perl怎麽实现呢﹖我只会bash下的办法。。。
CPAN 上有一些 module 可以试试: File::Tee (不能在 Windows 上执行)、Tee、
IO::CaptureOutput 等
这些 module 都能将如 system() 的输出也导到档案 (跟 tee 的功能相同)
如果您只是想将 print、printf、syswrite 等输出的结果同时导到档案,而忽略
system() 等由子行程输出的结果 (这可能需要透过 IPC)
则可以考虑使用 IO::Tee
您甚至可以自己利用 tie 实作一简单的多工输出的 file handle (事实上 IO::Tee 就是
用 tie 实作的)
Tee.pm 的内容为:
#!/usr/bin/perl
use warnings;
use strict;
package Tee;
sub TIEHANDLE {
my $class = shift;
my @fh = @_;
bless \@fh, $class;
}
sub WRITE {
my $this = shift;
syswrite $_, @_ for @$this;
}
sub PRINT {
my $this = shift;
print {$_} @_ for @$this;
}
sub PRINTF {
my $this = shift;
printf {$_} @_ for @$this;
}
1;
而主程式为:
#!/usr/bin/perl
use warnings;
use strict;
use Tee;
open my $log, '>', 'log.txt' or die;
tie *FH, 'Tee', \*STDOUT, $log;
select(*FH);
print "hello world!\n";
这时 "hello world!\n" 会同时输出到 STDOUT 和档案 log.txt
(请参考
http://perldoc.perl.org/perltie.html#Tying-FileHandles )
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 111.243.162.213
1F:推 herolee:请问如何可以实时的捕捉system()系统调用这种的输出呢﹖ 05/14 11:12
2F:→ frank1983:前面提到的File::Tee、Tee、IO::CaptureOutput 都可以啊 05/14 16:31
3F:→ frank1983:或者你真正要的只是 perl script.pl 2>&1 | tee log.txt 05/14 16:34
4F:推 herolee:没错﹐perl | tee这种我是知道的﹐但是用的时候不直接。 05/14 23:22