我正在尝试使用Perl的system
函数来捕获输出,以执行并将系统命令的ouptut重定向到文件,但由于某种原因,我没有得到整个输出。
我正在使用以下方法:
system("example.exe >output.txt");
这段代码有什么问题,还是有其他方法可以做同样的事情?
答案 0 :(得分:12)
与MVS's answer相同,但现代且安全。
use strict;
use warnings;
open (my $file, '>', 'output.txt') or die "Could not open file: $!";
my $output = `example.exe`;
die "$!" if $?;
print $file $output;
更容易
use strict;
use warnings;
use autodie;
open (my $file, '>', 'output.txt');
print $file `example.exe`;
如果你需要STDOUT和STDERR
use strict;
use warnings;
use autodie;
use Capture::Tiny 'capture_merged';
open (my $file, '>', 'output.txt');
print $file capture_merged { system('example.exe') };
答案 1 :(得分:10)
使用plain>重定向输出只会抓住STDOUT。如果您还想捕获STDERR,请使用2>& 1:
perl -e 'system("dir blablubblelel.txt >out.txt 2>&1");'
有关详细信息,请参阅Perlmonks
答案 2 :(得分:1)
如果要永久重定向输出,可以执行以下操作:
#redirect STDOUT before calling other functions
open STDOUT,'>','outputfile.txt' or die "can't open output";
system('ls;df -h;echo something'); #all will be redirected.
答案 3 :(得分:0)
您也可以尝试让Perl捕获输出:
open(FILE, ">output.txt") or die "Could not open file: $!";
print FILE `example.exe`;
close(FILE);
答案 4 :(得分:0)
我发现这是一种非常好的方式:
use warnings;
use strict;
use Capture::Tiny::Extended 'capture';
my ($out, $err, $ret) = capture {
system 'example.exe';
};
$ret = $ret >> 8;
print "OUT: $out\n";
print "ERR: $err\n";
print "RET: $ret\n";
感谢DWGuru对Capture::Tiny::Extended发表评论。 : - )
答案 5 :(得分:-1)
这有效:
在C代码中,您可以使用以下行来捕获所需的输出:
system("example.exe > \"output.txt\"");