Курс по Raku / Обекти, вход-изход и изключения / Вход и изход / Стартиране на външни програми 🆕
Обектът Proc
Всяко извикване на run или shell връща
обект Proc — малък запис, описващ програмата, която е била
изпълнена, и как е приключила. Предишните теми използваха манипулатора
му .out, за да четат изхода; Proc носи повече
от това.
Най-полезната част е кодът на изход. Програмата
казва на онзи, който я е стартирал, дали е успяла, с малко цяло число:
0 означава успех, а всяко друго число е код за провал по
избор на самата програма. .exitcode ви дава това число:
my $proc = run 'sh', '-c', 'exit 3';
say $proc.exitcode; # 3За обичайния въпрос с „да/не“ — проработи ли? — Proc е
просто истина, когато кодът на изход е 0, и лъжа в противен
случай, така че можете да го проверите направо:
my $proc = run 'ls', '/', :out;
$proc.out.slurp(:close);
say $proc ?? 'ok' !! 'failed'; # okProc помни и командата, която е стартирал, в
.command:
my $proc = run 'echo', 'hi', :out;
$proc.out.slurp(:close);
say $proc.command; # (echo hi)Едно нещо за внимание: ако команда се провали и вие просто
пренебрегнете върнатия Proc, Raku повдига
изключение, вместо да остави провала да мине незабелязано:
run 'sh', '-c', 'exit 1';
# умира: The spawned command 'sh' exited unsuccessfully (exit code: 1, signal: 0)Понеже ненулевият изход обикновено означава, че нещо се е объркало,
провалил се Proc, който е изхвърлен, хвърля изключение,
когато излезе от обхват. Спусъкът е изхвърлянето на резултата,
а не пренебрегването на кода на изход: простото съхраняване на
Proc в променлива е достатъчно, за да избегнете
изключението, дори ако никога повече не го погледнете.
my $proc = run 'sh', '-c', 'exit 1'; # няма грешка, макар да се провали
# …и $proc никога повече не се използваЗатова, ако очаквате, че команда може да се провали,
запазете нейния Proc и после погледнете
.exitcode (или го проверете като булева стойност), когато
поискате да разберете какво се е случило.
Практика
Направете 1 тест върху съдържанието на тази тема.
Навигация в курса
← Прихващане на изхода | Тест — Обектът Proc →
💪 Или преминете направо към упражненията в този
раздел.