Курс языка программирования 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 →
💪 Или перейдите сразу к упражнениям этого
раздела.