Как вызвать системную команду в 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");