Если вам не нужно содержимое 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 и обратных кавычек, IPC :: System :: Simple возвращает полное 32-битное значение выхода под Windows. Он также генерирует подробное исключение, если команда не может быть запущена, умирает от сигнала или возвращает неожиданное значение выхода. Это означает, что для многих программ вместо того, чтобы самостоятельно проверять значения выхода, вы можете положиться на IPC :: System :: Simple, который сделает за вас тяжелую работу:
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.
Всего наилучшего,
Павел
person
pjf
schedule
21.09.2008