Re: [問題] 請教如何實現下邊這種重定向﹖

看板Perl作者 (hero)時間14年前 (2011/05/15 03:51), 編輯推噓1(100)
留言1則, 1人參與, 最新討論串3/4 (看更多)
※ 引述《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
2的話用$|=1沒辦法解決嗎?
05/15 13:11, 1F
文章代碼(AID): #1DpqsdVo (Perl)
討論串 (同標題文章)
文章代碼(AID): #1DpqsdVo (Perl)