La forma habitual de lanzar un proceso en Perl es a través el comando system
:
system 'ls -l $PATH'En el ejemplo hemos usado comillas simples para impedir que Perl interpole la variable
$PATH
. Quien debe interpolarla es la shell que ejecutará el comando.
También es posible escribir:
system "ls -l \$PATH"
cuando el comando usado como argumento no implica redirección, canales (pipes), etc. el comando es ejecutado directamente por Perl. En caso contrario Perl llama a la shell para que ejecute el comando. En este segundo caso el comando se convierte en un proceso nieto del programa Perl.
Si se llama al comando system
con mas de un argumento Perl no llamará a la shell, cualquiera
que sea la forma del comando. En ese caso, el primer argumento se interpreta como el nombre
del comando y los siguientes como los argumentos para el mismo.
El valor devuelto por system
es el devuelto por el proceso hijo.
$status = system('command');Retorna
-1
si el programa no se pudo arrancar. Con perldoc perlvar
puede obtener información sobre la variable $?
, la cuál contiene
el estatus retornado por el programa. Un ejemplo de uso, comprobando el estatus
es:
if ($? == -1) { print "No se pudo ejecutar: $!\n"; } elsif ($? & 127) { printf "El proceso hijo a muerto con señal %d, %s coredump\n", ($? & 127), ($? & 128) ? 'con' : 'sin'; } else { printf "Proceso hijo termina con estatus %d\n", $? >> 8; }
Se puede usar una segunda sintáxis con system
, separando los argumentos
mediante comas:
$status = system('command', 'arg1','arg2');
En este caso, es Perl quien ejecuta el comando y ningún metacarácter shell (redirecciones, pipes, etc.) será interpretado. Por ejemplo:
@args = ("command", "arg1", "arg2"); system(@args) == 0 or die "system @args failed: $?"