作者herolee (hero)
看板Perl
标题Re: [问题] 请教如何实现下边这种重定向﹖
时间Sun May 15 11:51:01 2011
※ 引述《frank1983 (What?)》之铭言:
: ※ 引述《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";
如前所述﹐还有两点不明﹐希望指点。
1、这个例子并没有重定向STDERR﹐有办法收集到STDERR的东东麽。
另外诸如die "Error:$!"这种有没有办法实现最初的设想﹐类似2>&1 |tee这种效果。
2、系统调用比如 `ls -l. `之类不能达到上述效果。
可以通过print $tee `ls -l .`;来实现﹐但是这样的效果是屏幕输出不及时。
得等系统命令执行完毕後﹐才能打印输出。这对於一些执行时间较长的命令﹐
效果很不好。
: 这时 "hello world!\n" 会同时输出到 STDOUT 和档案 log.txt
: (请参考 http://perldoc.perl.org/perltie.html#Tying-FileHandles )
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 118.26.190.151
1F:推 abliou:2的话用$|=1没办法解决吗? 05/15 13:11