Si no desea que el contenido de STDERR, entonces la orden de captura() del módulo de IPC::System::Simple es casi exactamente lo que está buscando:
use IPC::System::Simple qw(capture system $EXITVAL);
my $output = capture($cmd, @args);
my $exit_value = $EXITVAL;
Puede usar captura() con un argumento único invocar el shell, o múltiples argumentos para evitar de manera confiable el shell. También hay capturex() que nunca llama al shell, incluso con un solo argumento.
A diferencia de los comandos integrados de sistema y retroceso de Perl, IPC :: System :: Simple devuelve el valor de salida completo de 32 bits en Windows. También arroja una excepción detallada si el comando no puede iniciarse, muere a una señal o devuelve un valor de salida inesperado.Esto significa que para muchos programas, en lugar de comprobar la salida valora a sí mismo, se puede confiar en IPC :: System :: Simple para hacer el trabajo duro para usted:
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 es pura Perl, no tiene dependencias, y funciona tanto en sistemas Unix como Windows. Desafortunadamente, no proporciona una forma de capturar STDERR, por lo que puede no ser adecuado para todas sus necesidades.
IPC::Run3 proporciona una interfaz limpia y fácil para volver a conectar las tres manejadoras de archivos comunes, pero desafortunadamente no comprueba si el comando fue exitoso, por lo que deberá inspeccionar $? manualmente, lo cual no es para nada divertido. ¿Proporciona una interfaz pública para inspeccionar $? es algo que está en mi to-do list para IPC :: System :: Simple, desde inspeccionar $? en una plataforma multiplataforma no es una tarea que desearía a nadie.
Hay otros módulos en el espacio de nombres IPC:: que también pueden proporcionarle ayuda. YMMV.
Todo lo mejor,
Paul
No sé por qué los enlaces están jodidos. Todo se ve bien en editar/vista previa. –
He enviado perl5porters un parche a IPC :: Open2 y :: Open3 para mostrar las cosas de waitpid en el SINOPSIS de esos módulos. :) –