Gibt es eine Möglichkeit, einen Systembefehl wie ls
oder fuser
in Rust aufzurufen ? Wie wäre es mit der Erfassung der Ausgabe?
89
std::process::Command
ermöglicht das.
Es gibt mehrere Möglichkeiten, einen untergeordneten Prozess zu erzeugen und einen beliebigen Befehl auf dem Computer auszuführen:
spawn
- führt das Programm aus und gibt einen Wert mit Details zurückoutput
- führt das Programm aus und gibt die Ausgabe zurückstatus
- führt das Programm aus und gibt den Exit-Code zurückEin einfaches Beispiel aus den Dokumenten:
use std::process::Command;
Command::new("ls")
.arg("-l")
.arg("-a")
.spawn()
.expect("ls command failed to start");
output
Funktion gibt Vec nach Abschluss des Prozesses zurück. Also, falls wir so etwas laufen lassenCommand("ping google.com")
. Ist dies möglich, um diese Befehle auszugeben, da sie nicht beendet werden, aber ich möchte ihre Protokolle drucken. Bitte vorschlagen.spawn
in dieser Antwort einChild
Ergebnis mit Standard-E / A-Streams zurück.Ein sehr klares Beispiel aus den Dokumenten :
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());
quelle
Es ist tatsächlich möglich! Das entsprechende Modul ist
std::run
.let mut options = std::run::ProcessOptions::new(); let process = std::run::Process::new("ls", &[your, arguments], options);
ProcessOptions
'Standard-Dateideskriptoren sind standardmäßigNone
(Erstellen einer neuen Pipe), sodass Sieprocess.output()
(zum Beispiel) nur zum Lesen aus der Ausgabe verwenden können.Wenn Sie den Befehl ausführen und alle seine Ausgaben erhalten möchten, nachdem er ausgeführt wurde, gibt es
wait_with_output
dafür .Process::new
, seit gestern, gibt übrigens einOption<Process>
statt ein zurückProcess
.quelle
std::io::process
stattdessen (Antwort unten).std::process
jetzt ab rustc 1.19.0.