Czy istnieje sposób wywołania polecenia systemowego, takiego jak ls
lub fuser
w Rust? Co powiesz na uchwycenie jego wyników?
87
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");
output
funkcja 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.spawn
wspomniany w tej odpowiedzi, zwracaChild
wynik ze standardowymi strumieniami I / O.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());
źródło
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_output
na to .Process::new
nawiasem mówiąc , od wczoraj zwraca anOption<Process>
zamiast aProcess
.źródło
std::io::process
zamiast tego (odpowiedź poniżej).std::process
teraz od rustc 1.19.0.