2010-05-25 321 views
10

我正在尋找一個使用Perl將stdout重定向到文件的示例。我正在做一個相當簡單的fork/exec工具,我想將孩子的輸出重定向到一個文件而不是父標準輸出。如何將標準輸出重定向到Perl中的文件?

是否有一個平等的dup2()我應該使用?我似乎無法找到它

+1

從Perl中或在命令行?什麼OS? – lexu 2010-05-25 18:58:19

+1

請看這裏:http://stackoverflow.com/questions/655719/how-do-i-unalias-from-perls-stdout – lexu 2010-05-25 18:59:51

+0

如果是這種情況,你只是旨在重定向程序的輸出是'exec這個問題並不一定是Perl特有的,這是一個shell重定向的問題,或者當你調用它的時候,使用任何內置於程序中的設施。例如'exec(「program> out.txt」);'。 – cikkle 2010-05-25 19:55:10

回答

27

從的perldoc -f打開:

open STDOUT, '>', "foo.out" 

該文檔是你的朋友?

4

孩子本身可以做select $filehandle指定其所有print的調用應該指向特定的文件句柄。

父母可以做的最好的事情是使用systemexec或其他類型的東西進行外殼重定向。

3
open my $fh, '>', $file; 
defined(my $pid = fork) or die "fork: $!"; 
if (!$pid) { 
    open STDOUT, '>&', $fh; 

    # do whatever you want 
    ... 

    exit; 
} 
waitpid $pid, 0; 
print $? == 0 ? "ok\n" : "nok\n"; 
+0

非常好的方法,但不幸的是,由於系統退出功能限制,不可能將任何文本反向編號。 – Znik 2014-02-26 12:32:50

3

一個嚴格的信息,但不實際的答案:

雖然幾乎可以肯定的要對這個取決於你想要做什麼的確切細節,如果你絕對必須有dup2()更優雅的方式,它的Perl等價物存在於POSIX模塊中。但是,在這種情況下,您正在處理實際的文件描述符,而不是Perl文件句柄,相應地,您僅限於使用POSIX模塊中提供的其他功能,所有這些功能都類似於您在C中使用的功能。在某種程度上,你將會在非Perlish Per Perl中編寫C語言。

http://perldoc.perl.org/POSIX.html

4

由於JS劉海說,一個簡單的方法來重定向輸出是使用「選擇」的發言。
非常感謝stackoverflow和他們的用戶。我希望這是有益

例如:

print "to console\n"; 
open OUTPUT, '>', "foo.txt" or die "Can't create filehandle: $!"; 
select OUTPUT; $| = 1; # make unbuffered 
print "to file\n"; 
print OUTPUT "also to file\n"; 
print STDOUT "to console\n"; 
# close current output file 
close(OUTPUT); 
# reset stdout to be the default file handle 
select STDOUT; 
print "to console"; 
+0

不幸的是,這隻能在perl腳本內部使用。它不會重定向系統函數調用的命令的輸出。 – Znik 2014-02-26 12:34:05

相關問題