Как мне вызвать системную команду в Rust и записать ее вывод?

87

Есть ли способ , чтобы вызвать системную команду, как lsи fuserв Rust? Как насчет записи его вывода?

quux00
источник

Ответы:

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>вместо Process.

Ry-
источник
31
Для всех искателей: std :: run был удален, см. std::io::processВместо этого (ответ ниже).
jgillich
2
Теперь это std::processверсия rustc 1.19.0.
WiSaGaN