Чи є спосіб викликати системну команду, наприклад 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")
. Чи можливо це отримати ці команди, оскільки вони не закінчуються, але я хочу надрукувати їх журнали. Будь ласка, підкажіть.