Есть ли способ , чтобы вызвать системную команду, как 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>
вместо Process
.
std::io::process
Вместо этого (ответ ниже).
std::process
версия rustc 1.19.0.
output
функция возвращает Vec после завершения процесса. Итак, если мы запустим что-то вродеCommand("ping google.com")
. Возможно ли получить этот вывод команд, поскольку он не будет завершен, но я хочу распечатать его журналы. Пожалуйста, предложите.