Gibt es eine Möglichkeit, einen Systembefehl wie lsoder fuserin Rust aufzurufen ? Wie wäre es mit der Erfassung der Ausgabe?
Antworten:
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");
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());
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 Sie process.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_outputdafür .
Process::new, seit gestern, gibt übrigens ein Option<Process>statt ein zurück Process.
std::io::processstattdessen (Antwort unten).
std::processjetzt ab rustc 1.19.0.
outputFunktion 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.