Это должно сделать это: это позволяет оболочке обрабатывать перенаправление для STDERR.У меня нет Windows, поэтому я не знаю, какими будут соответствующие биты в cmd.exe
.
#!/usr/bin/perl
use strict;
use warnings;
sub run_command(\@$) {
my($log, $cmd) = @_;
my($redirect_start, $redirect_end);
if ($^O =~ /Win/) {
# @TODO
$redirect_start = '???';
$redirect_end = '???';
} else {
$redirect_start = '(';
$redirect_end = ') 2>&1';
}
open(my $fh, "${redirect_start}${cmd}${redirect_end} |")
or die "ERROR: $!\n";
while (<$fh>) {
push(@{ $log }, $_);
print;
}
close($fh)
or die "ERROR: $!\n";
}
my @log;
run_command(@log, 'ls dummy.*');
run_command(@log, 'ls -lht dummy.txt');
print "\nLOG:\n";
print foreach (@log);
exit 0;
Пример вывода с моей машины:
$ perl dummy.pl
dummy.c
dummy.c~
...
dummy.txt
dummy.txt~
dummy.xml
-rw-rw-r--. 1 USER USER 926 Jan 25 23:33 dummy.txt
LOG:
dummy.c
dummy.c~
...
dummy.txt
dummy.txt~
dummy.xml
-rw-rw-r--. 1 USER USER 926 Jan 25 23:33 dummy.txt
ЕслиПриведенное выше решение не является удовлетворительным, я бы посоветовал изучить IPC :: Open3 .