Курс по 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'; # ok

Proc помни и командата, която е стартирал, в .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


💪 Или преминете направо към упражненията в този раздел.