it-swarm.com.ru

Лучший способ записать вывод из системной команды в текстовый файл?

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

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

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

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

8
int80h

То же, что и ответ 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') };
12
Joel Berger

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

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

Для более подробной информации смотрите Perlmonks

10
Frank Schmitt

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

#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.
1
Znik

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

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
Francisco Zarabozo

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

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