Curso de Raku / Objetos, entrada/salida y excepciones / Entrada y salida / Ejecutar programas externos 🆕
El objeto Proc
Cada llamada a run o shell devuelve un
objeto Proc: un pequeño registro que describe el programa
que se ejecutó y cómo terminó. Los temas anteriores usaron su manejador
.out para leer la salida; el Proc lleva más
cosas consigo.
La parte más útil es el código de salida. Un
programa le dice a quien lo lanzó si tuvo éxito mediante un entero
pequeño: 0 significa éxito y cualquier otro número es un
código de fallo elegido por el propio programa. .exitcode
te da ese número:
my $proc = run 'sh', '-c', 'exit 3';
say $proc.exitcode; # 3Para la pregunta habitual de sí o no — ¿funcionó? — un
Proc es simplemente verdadero cuando el código de salida es
0 y falso en caso contrario, así que puedes evaluarlo
directamente:
my $proc = run 'ls', '/', :out;
$proc.out.slurp(:close);
say $proc ?? 'ok' !! 'failed'; # okUn Proc también recuerda la orden que lanzó, en
.command:
my $proc = run 'echo', 'hi', :out;
$proc.out.slurp(:close);
say $proc.command; # (echo hi)Hay algo a lo que estar atento: si una orden falla y tú simplemente
ignoras el Proc devuelto, Raku lanza una
excepción en lugar de dejar pasar el fallo sin más:
run 'sh', '-c', 'exit 1';
# dies: The spawned command 'sh' exited unsuccessfully (exit code: 1, signal: 0)Como una salida distinta de cero suele significar que algo salió mal,
un Proc fallido que se tira lanza una excepción cuando sale
de ámbito. Lo que lo dispara es descartar el resultado, no
ignorar su código de salida: basta con guardar el Proc en
una variable para evitar la excepción, aunque no vuelvas a mirarlo
nunca.
my $proc = run 'sh', '-c', 'exit 1'; # no error, even though it failed
# …and $proc is never used againAsí que, si esperas que una orden pueda fallar, guarda su
Proc y mira después .exitcode (o evalúalo como
booleano) cuando quieras saber qué pasó.
Práctica
Resuelve 1 cuestionario sobre el contenido de este tema.
Navegación del curso
← Capturar la salida | Quiz — El objeto Proc →
💪 O ve directamente a los ejercicios de esta
sección.