Чи є спосіб викликати системну команду, наприклад lsабо fuserв Rust? Як щодо захоплення його результату?
Відповіді:
std::process::Command дозволяє це.
Існує кілька способів породити дочірній процес і виконати довільну команду на машині:
spawn - запускає програму і повертає значення з деталямиoutput - запускає програму і повертає результатиstatus - запускає програму і повертає код виходуОдин простий приклад з документації:
use std::process::Command;
Command::new("ls")
.arg("-l")
.arg("-a")
.spawn()
.expect("ls command failed to start");
дуже наочний приклад із документації :
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());
Це справді можливо! Відповідним модулем є 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, до речі.
std::io::processНатомість (відповідь нижче).
std::processстаном на rustc 1.19.0.
outputфункція повертає Vec після завершення процесу. Отже, на випадок, якщо ми запустимо щось подібнеCommand("ping google.com"). Чи можливо це отримати ці команди, оскільки вони не закінчуються, але я хочу надрукувати їх журнали. Будь ласка, підкажіть.