Курс 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


💪 Або перейдіть одразу до вправ цього розділу.