Курс 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 →
💪 Або перейдіть одразу до вправ цього
розділу.