Курс языка программирования 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


💪 Или перейдите сразу к упражнениям этого раздела.