从系统命令到文本文件捕获输出的最佳方法?

时间:2011-10-17 20:17:23

标签: perl shell system exec io-redirection

我正在尝试使用Perl的system函数来捕获输出,以执行并将系统命令的ouptut重定向到文件,但由于某种原因,我没有得到整个输出。

我正在使用以下方法:

system("example.exe >output.txt");

这段代码有什么问题,还是有其他方法可以做同样的事情?

6 个答案:

答案 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\"");