2010-05-25 324 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

相关问题