Если вы не хотите, чтобы содержимое STDERR, то команда захвата() из модуля IPC::System::Simple почти точно, что вы после:
use IPC::System::Simple qw(capture system $EXITVAL);
my $output = capture($cmd, @args);
my $exit_value = $EXITVAL;
Вы можете использовать захват() с одним аргументом для вызова оболочки или нескольких аргументов, чтобы надежно избежать оболочки. Существует также capturex(), который никогда не вызывает оболочку, даже с одним аргументом.
В отличие от встроенных команд Perl и команд backticks, 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 обеспечивает чистый и простой интерфейс для повторного монтажа всех трех обычных дескрипторов файлов, но, к сожалению, он не проверяет, была ли команда успешной, поэтому вам нужно будет проверить $? вручную, что совсем не весело. Предоставление открытого интерфейса для проверки $? это что-то, что находится на моем to-do list для IPC :: System :: Simple, так как проверка $? в кросс-платформенной моде - это не задача, которую я хотел бы пожелать никому.
В пространстве имен IPC:: есть другие модули, которые также могут предоставить вам помощь. YMMV.
Все самое лучшее,
Пол
Я не знаю, почему ссылки прикручены. Все отлично работает в edit/preview. – 2008-09-20 19:57:39
Я отправил perl5porters патч для IPC :: Open2 и :: Open3, чтобы показать файл waitpid в SYNOPSIS этих модулей. :) – 2008-09-21 21:56:25