Як мені викликати системну команду в Rust і вловити її вихідні дані?


87

Чи є спосіб викликати системну команду, наприклад lsабо fuserв Rust? Як щодо захоплення його результату?

Відповіді:


115

std::process::Command дозволяє це.

Існує кілька способів породити дочірній процес і виконати довільну команду на машині:

  • spawn - запускає програму і повертає значення з деталями
  • output - запускає програму і повертає результати
  • status - запускає програму і повертає код виходу

Один простий приклад з документації:

use std::process::Command;

Command::new("ls")
        .arg("-l")
        .arg("-a")
        .spawn()
        .expect("ls command failed to start");

2
Що робити, якщо мені потрібно отримати вихід у реальному часі. Я думаю, outputфункція повертає Vec після завершення процесу. Отже, на випадок, якщо ми запустимо щось подібне Command("ping google.com"). Чи можливо це отримати ці команди, оскільки вони не закінчуються, але я хочу надрукувати їх журнали. Будь ласка, підкажіть.
GrvTyagi

3
@GrvTyagi:, spawnзгаданий у цій відповіді, повертає Childрезультат зі стандартними потоками вводу-виводу.
Ry-

На основі цієї чудової відповіді, я також знайшов цю відповідь корисною для розуміння того, як взаємодіяти з stdin / stdout.
Майкл Ногера,

33

дуже наочний приклад із документації :

use std::process::Command;
let output = Command::new("/bin/cat")
                     .arg("file.txt")
                     .output()
                     .expect("failed to execute process");

println!("status: {}", output.status);
println!("stdout: {}", String::from_utf8_lossy(&output.stdout));
println!("stderr: {}", String::from_utf8_lossy(&output.stderr));

assert!(output.status.success());

8

Це справді можливо! Відповідним модулем є std::run.

let mut options = std::run::ProcessOptions::new();
let process = std::run::Process::new("ls", &[your, arguments], options);

ProcessOptions'стандартний дескриптор файлу за замовчуваннямNone (створити нову трубу), тому ви можете просто використовувати process.output()(наприклад) для читання з її виводу.

Якщо ви хочете запустити команду та отримати всі її результати після її закінчення, є wait_with_outputдля цього .

Process::new, станом на вчора, повертає Option<Process>замість a Process, до речі.


31
Для всіх шукачів: std :: run видалено, див. std::io::processНатомість (відповідь нижче).
jgillich

2
Зараз це std::processстаном на rustc 1.19.0.
WiSaGaN
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.