Czy istnieje sposób wywołania polecenia systemowego, takiego jak lslub fuserw Rust? Co powiesz na uchwycenie jego wyników?
Odpowiedzi:
std::process::Command na to pozwala.
Istnieje wiele sposobów tworzenia procesu potomnego i wykonania dowolnego polecenia na komputerze:
spawn - uruchamia program i zwraca wartość ze szczegółamioutput - uruchamia program i zwraca wynikstatus - uruchamia program i zwraca kod zakończeniaJeden prosty przykład z dokumentacji:
use std::process::Command;
Command::new("ls")
.arg("-l")
.arg("-a")
.spawn()
.expect("ls command failed to start");
bardzo jasny przykład z dokumentacji :
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());
To rzeczywiście możliwe! Odpowiednim modułem jest std::run.
let mut options = std::run::ProcessOptions::new();
let process = std::run::Process::new("ls", &[your, arguments], options);
ProcessOptions'standardowe deskryptory plików domyślnieNone (utwórz nowy potok), więc możesz po prostu użyć process.output()(na przykład) do odczytu z jego wyjścia.
Jeśli chcesz uruchomić polecenie i uzyskać wszystkie jego dane wyjściowe po jego zakończeniu, jest wait_with_outputna to .
Process::newnawiasem mówiąc , od wczoraj zwraca an Option<Process>zamiast a Process.
std::io::processzamiast tego (odpowiedź poniżej).
std::processteraz od rustc 1.19.0.
outputfunkcja zwraca Vec po zakończeniu procesu. A więc na wypadek gdybyśmy uruchomili coś takiegoCommand("ping google.com"). Czy jest to możliwe, aby uzyskać wyjście tego polecenia, ponieważ nie zakończy się, ale chcę wydrukować jego dzienniki. Proszę zasugeruj.