2010-12-11 73 views
8

我想將STDERRSTDOUT重定向到變量。我做到了。如何將STDOUT和STDERR重定向到變量

close(STDOUT); 
close(STDERR); 

my $out; 
open(STDOUT, ">>", \$out); 
open(STDERR, ">>", \$out); 

for(1..10) 
{ 
    print "print\n"; # this is ok. 
    warn "warn\n"; # same 
    system("make"); # this is lost. neither in screen nor in variable. 
} 

問題system。我希望這個調用的輸出也被捕獲。

回答

3

您是否想要捕獲變量中的輸出?如果是這樣,您可以使用反引號或qx{}進行適當的重定向。例如,你可以使用:

#/usr/bin/env perl 
use strict; 
use warnings; 

# Ensure we have a way to write messages 
open my $fh, '>', "output" or die; 

close(STDOUT); 
close(STDERR); 

my $out; 
open(STDOUT, ">>", \$out) or do { print $fh, "failed to open STDOUT ($!)\n"; die }; 
open(STDERR, ">>", \$out) or do { print $fh, "failed to open STDERR ($!)\n"; die }; 

foreach my $i (1..10) 
{ 
    print "print $i\n"; 
    warn "warn $i\n"; 
    my $extra = qx{make pth$i 2>&1}; 
    print $fh "<<$i>><<$out>><<$extra>>\n"; 
} 

(我碰巧在目錄中有程序PTH1,PTH2和pth3 - 它們是由OK; pth4及以上錯誤寫入標準錯誤;重定向是必要的。)

您應該經常檢查操作是否成功,如open()

這是爲什麼這是必要的?因爲寫入變量需要進行寫作的過程的合作 - 而make不知道如何合作。

2

發生這種情況的原因是STDOUT和STDERR「文件句柄」是而不是等同於shell提供給perl二進制文件的stderr和stdout句柄。爲了達到你想要的效果,你應該使用open而不是system

+0

$ out。= qx {make};但是不認爲這是一個好方法。 – Deck 2010-12-11 06:32:45

+2

@Israfil:這是*做的方法。 – 2010-12-11 06:39:11

1

爲什麼不是use IPC::Open3

+0

因爲它在Win32上無法正常工作。 – dolmen 2011-04-16 10:24:01

0

redirect and restore STDOUT有幾種方法。他們中的一些人也與STDERR一起工作。這裏是我的兩個最愛:

使用select

my $out; 
open my $fh, ">>", \$out; 
select $fh; 
print "written to the variable\n"; 
select STDOUT; 
print "written to original STDOUT\n"; 

使用local

my $out 
do { 
    local *STDOUT; 
    open STDOUT, ">>", \$out; 
    print "written to the variable\n"; 
}; 
print "written to original STDOUT\n"; 

享受。

相關問題