Если вам не нужно содержимое STDERR, то команда capture () из модуля IPC :: System :: Simple - это почти то, что вам нужно:
use IPC::System::Simple qw(capture system $EXITVAL);
my $output = capture($cmd, @args);
my $exit_value = $EXITVAL;
Вы можете использовать метод capture () с одним аргументом для вызова оболочки или несколькими аргументами для надежного обхода оболочки. Также есть метод capturex (), который никогда не вызывает оболочку, даже с одним аргументом.
В отличие от встроенной в Perl команды system и backticks, IPC :: System :: Simple возвращает полное 32-битное значение выхода в Windows. Он также выдает подробное исключение, если команда не может быть запущена, умирает от сигнала или возвращает неожиданное значение выхода. Это означает, что для многих программ, вместо того, чтобы проверять значения выхода самостоятельно, вы можете положиться на
IPC :: System :: Просто сделать тяжелую работу за вас:
use IPC::System::Simple qw(system capture $EXIT_ANY);
system( [0,1], "frobincate", @files); # Must return exitval 0 or 1
my @lines = capture($EXIT_ANY, "baznicate", @files); # Any exitval is OK.
foreach my $record (@lines) {
system( [0, 32], "barnicate", $record); # Must return exitval 0 or 32
}
IPC :: System :: Simple - это чистый Perl, не имеет зависимостей и работает как в системах Unix, так и в Windows. К сожалению, он не обеспечивает способ захвата STDERR, поэтому он может не подходить для всех ваших потребностей.
IPC :: Run3 предоставляет простой и понятный интерфейс для повторного подключения всех трех общих файловых дескрипторов, но, к сожалению, он не проверяет, была ли команда выполнена успешно, поэтому вам нужно проверить $? вручную, что совсем не весело. Предоставление открытого интерфейса для проверки $? что-то, что находится в моем списке дел для IPC :: System :: Simple, начиная с проверки $? в кроссплатформенном стиле это не та задача, которую я желал бы никому.
В пространстве имен IPC :: есть и другие модули, которые также могут оказать вам помощь. YMMV.
Всего наилучшего,
Пол