Как вызвать системную команду в Rust и захватить ее вывод?
Есть ли способ вызвать системную команду, например ls
или fuser
в Rust? Как захватить его выход?
Ответы
Ответ 1
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
очень яркий пример из документов:
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());
Ответ 3
Это действительно возможно! Соответствующий модуль - 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>
вместо Process
, кстати.
Ответ 4
Или вы можете попробовать этот ящик cmd_lib, это обертка вокруг std::process, для написания задач типа shell-script чистым, естественным и ржавым способом:
let all_files = run_fun!("ls -a .")?;
// pipe commands are also supported
run_cmd!("du -ah . | sort -hr | head -n 10");