Есть ли способ , чтобы вызвать системную команду, как ls
и fuser
в Rust? Как насчет записи его вывода?
87
std::process::Command
позволяет это.
Есть несколько способов вызвать дочерний процесс и выполнить произвольную команду на машине:
spawn
- запускает программу и возвращает значение с деталямиoutput
- запускает программу и возвращает результатstatus
- запускает программу и возвращает код выходаОдин простой пример из документации:
use std::process::Command;
Command::new("ls")
.arg("-l")
.arg("-a")
.spawn()
.expect("ls command failed to start");
output
функция возвращает Vec после завершения процесса. Итак, если мы запустим что-то вродеCommand("ping google.com")
. Возможно ли получить этот вывод команд, поскольку он не будет завершен, но я хочу распечатать его журналы. Пожалуйста, предложите.spawn
упомянутый в этом ответе, возвращаетChild
результат со стандартными потоками ввода-вывода.очень четкий пример из документов :
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>
вместоProcess
.источник
std::io::process
Вместо этого (ответ ниже).std::process
версия rustc 1.19.0.