Лучший способ записать вывод из системной команды в текстовый файл? - PullRequest
8 голосов
/ 18 октября 2011

Я пытаюсь получить выходные данные от использования функции system в Perl для выполнения и перенаправления выходных данных системной команды в файл, но по какой-то причине я не получаю весь вывод.

I 'используя следующий метод:

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

Что не так с этим кодом или есть альтернативный способ сделать то же самое?

Ответы [ 6 ]

12 голосов
/ 18 октября 2011

То же, что и Ответ MVS , но современный и безопасный.

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') };
10 голосов
/ 18 октября 2011

Перенаправление вывода с обычным> будет ловить только STDOUT.Если вы также хотите поймать STDERR, используйте 2> & 1:

perl -e 'system("dir blablubblelel.txt >out.txt 2>&1");' 

Для получения дополнительной информации см. Perlmonks

1 голос
/ 26 февраля 2014

Если вы хотите постоянно перенаправлять вывод, вы можете сделать:

#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.
0 голосов
/ 04 сентября 2015

Это работает:

В коде C вы можете иметь следующую строку для захвата требуемого вывода:

system("example.exe > \"output.txt\"");
0 голосов
/ 14 августа 2014

Я считаю, что это очень хороший способ сделать это:

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 . : -)

0 голосов
/ 18 октября 2011

Вы также можете попробовать сделать так, чтобы Perl перехватил вывод:

open(FILE, ">output.txt") or die "Could not open file: $!";
print FILE `example.exe`;
close(FILE);
...