Corso di Raku / Oggetti, input/output ed eccezioni / Input e output / Eseguire programmi esterni 🆕
L’oggetto Proc
Ogni chiamata a run o shell restituisce un
oggetto Proc — un piccolo verbale che descrive il programma
eseguito e come è terminato. Gli argomenti precedenti hanno usato il suo
handle .out per leggere l’output; il Proc
porta con sé altro ancora.
La parte più utile è il codice di uscita. Un
programma dice a chi lo ha lanciato se è riuscito, con un piccolo
intero: 0 significa successo, e qualunque altro numero è un
codice di fallimento a scelta del programma. .exitcode ti
dà quel numero:
my $proc = run 'sh', '-c', 'exit 3';
say $proc.exitcode; # 3Per la solita domanda sì/no — ha funzionato? — un Proc è
semplicemente vero quando il codice di uscita è 0 e falso
altrimenti, quindi puoi metterlo alla prova direttamente:
my $proc = run 'ls', '/', :out;
$proc.out.slurp(:close);
say $proc ?? 'ok' !! 'failed'; # okUn Proc ricorda anche il comando che ha lanciato, in
.command:
my $proc = run 'echo', 'hi', :out;
$proc.out.slurp(:close);
say $proc.command; # (echo hi)Una cosa a cui stare attenti: se un comando fallisce e tu
semplicemente ignori il Proc restituito,
Raku solleva un’eccezione invece di lasciar passare il fallimento
inosservato:
run 'sh', '-c', 'exit 1';
# dies: The spawned command 'sh' exited unsuccessfully (exit code: 1, signal: 0)Poiché un’uscita diversa da zero di solito significa che qualcosa è
andato storto, un Proc fallito che viene buttato via
solleva un’eccezione quando esce dal suo ambito. Ciò che scatena il
tutto è lo scartare il risultato, non l’ignorarne il codice di
uscita: basta conservare il Proc in una variabile per
evitare l’eccezione, anche se non lo guardi mai più.
my $proc = run 'sh', '-c', 'exit 1'; # no error, even though it failed
# …and $proc is never used againQuindi, se ti aspetti che un comando possa fallire, conserva
il suo Proc e guarda poi .exitcode (o mettilo
alla prova come booleano) quando vuoi sapere che cosa è successo.
Pratica
Risolvi 1 quiz sul contenuto di questo argomento.
Navigazione del corso
← Catturare l’output | Quiz — L’oggetto Proc →
💪 Oppure vai direttamente agli esercizi di questa
sezione.