我正在寻找使用Perl将stdout重定向到文件的示例。我正在做一个相当简单的fork / exec工具,我想将孩子的输出重定向到文件而不是父项标准输出。
我应该使用dup2()
的等效项吗?我似乎无法找到它
答案 0 :(得分:29)
来自perldoc -f open:
open STDOUT, '>', "foo.out"
文档是你的朋友......
答案 1 :(得分:6)
正如JS Bangs所说,重定向输出的一种简单方法是使用'select'语句 非常感谢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";
答案 2 :(得分:4)
子项本身可以select $filehandle
指定其所有print
调用都应指向特定的文件句柄。
父母可以做的最好的事情是使用system
或exec
或类似的东西进行shell重定向。
答案 3 :(得分: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";
答案 4 :(得分:3)
一个严格的信息但不切实际的答案:
虽然几乎肯定会有更优雅的方式来实现这个,具体取决于你要做的事情的具体细节,如果你绝对必须有dup2()
,那么它的Perl等价物会出现在{{1模块。但是,在这种情况下,您正在处理实际的文件描述符而不是Perl文件句柄,相应地,您只能使用POSIX模块中的其他提供的函数,所有这些函数都与您在C中使用的函数类似。在某种程度上,你会用非Perlish Perl写C.