Re: [問題] 請教如何實現下邊這種重定向﹖
※ 引述《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
推
05/15 13:11, , 1F
05/15 13:11, 1F
討論串 (同標題文章)
Perl 近期熱門文章
PTT數位生活區 即時熱門文章