Ich möchte einen beliebigen Bash-Befehl ausführen. Ich habe Command::new
gefunden, kann aber keine "komplexen" Befehle wie ls ; sleep 1; ls
ausführen. Außerdem, selbst wenn ich dies in ein Bash-Skript einfüge und es ausführe, werde ich nur das Ergebnis am Ende des Skripts haben (wie es im Prozess doc erklärt wird). Ich möchte das Ergebnis erhalten, sobald der Befehl es druckt (und auch Eingaben lesen können), genauso wie wir es in bash machen können.Führen Sie einen beliebigen Bash-Befehl aus, rufen Sie sofort die Ergebnisse von stdout/stderr ab und verwenden Sie stdin
Antwort
Command::new
ist zwar der Weg zu gehen, aber es soll ein Programm ausführen. ls ; sleep 1; ls
ist kein Programm, es ist Anweisungen für einige Shell. Wenn Sie so etwas ausführen möchten, müssen Sie eine Shell fragen, das für Sie zu interpretieren:
Command::new("/usr/bin/sh").args(&["-c", "ls ; sleep 1; ls"])
// your complex command is just an argument for the shell
die Ausgabe zu erhalten, gibt es zwei Möglichkeiten:
- die
output
Verfahren blockiert und gibt die Ausgänge und den Exit-Status des Befehls zurück. - die
spawn
Methode ist nicht blockierend, und gibt einen Handle der Prozess des Kindes enthältstdin
,stdout
undstderr
so können Sie mit dem Kind kommunizieren, und einwait
Methode für sie Ausfahrt sauber zu warten. Hinweis standardmäßig, dass das Kind erbt der übergeordneten Dateideskriptor und Sie könnten Rohre wollen stattdessen einzurichten:
Sie so etwas wie verwenden sollte:
let child = Command::new("/usr/bin/sh")
.args(&["-c", "ls sleep 1 ls"])
.stderr(std::process::Stdio::null()) // don't care about stderr
.stdout(std::process::Stdio::piped()) // set up stdout so we can read it
.stdin(std::process::Stdio::piped()) // set up stdin so we can write on it
.spawn().expect("Could not run the command"); // finally run the command
write_something_on(child.stdin);
read(child.stdout);
Danke, ich habe die Zeilen mit 'piped()' oder 'null()' kommentiert, weil ich die Dateideskriptoren der Eltern verwenden möchte. – x4rkz
Da 'Command' dem Builder-Muster folgt, ist es etwas idiomatischer, es so zu strukturieren: https://play.rust-lang.org/?gist=37194d432ecb64c32d5fc5e59937570e&version=stable&backtrace=0 –
@NateMara Eigentlich habe ich ursprünglich https geschrieben: //gist.github.com/2c21ce9e7b919b30cb1444548dc897d9, und war ziemlich überrascht, dass es "& mut self" anstelle von "self" braucht. Wie auch immer, du hast Recht, ich werde meine Antwort bearbeiten, danke. – mcarton
- 1. Führen Sie einen Python-Befehl innerhalb von vim aus und rufen Sie die Ausgabe ab.
- 2. Führen Sie die Build-Task von einem beliebigen Ort aus
- 3. So führen Sie die Stapeldatei aus einem beliebigen Ordner aus
- 4. So rufen Sie Funktionsparameter ab
- 5. Führen Sie ssh aus und führen Sie den Befehl aus
- 6. So rufen Sie die Originaldatei ab
- 7. py2neo: So rufen Sie die Knotenbezeichnung ab
- 8. Django - rufen Sie die Formulareingabewerte ab
- 9. Definieren Sie eine Lambda-Funktion und führen Sie sie sofort aus
- 10. So rufen Sie Text von UIAlertViewStylePlainTextInput ab
- 11. Outlook REST API - So rufen Sie einen Benutzer ab Foto
- 12. Rufen Sie den Assembly-Pfad ab C#
- 13. SQL Führen Sie eine Abfrage aus und führen Sie eine weitere basierend auf den Ergebnissen aus
- 14. Rufen Sie einen Controller aus einem anderen
- 15. Wie rufen Sie die Klasse ab, um die Schaltfläche auszublenden?
- 16. So rufen Sie SAMAccountName aus Active Directory ab
- 17. So führen Sie einen Node-Schedule-Job sofort und wiederkehrend nach jeweils 30 Minuten aus
- 18. So rufen Sie Benutzerinformationen aus Azure Active Directory ab
- 19. So rufen Sie Daten aus einer Hibernate-hbm-Datei ab
- 20. So rufen Sie Objekteigenschaftsinformationen aus der Datenbindung ab
- 21. So rufen Sie Daten nach Zeit ab
- 22. Führen Sie einen Befehl einmal aus, wenn Sie Dateien finden
- 23. So rufen Sie Daten synchron aus Firebase ab?
- 24. So rufen Sie das mehrsprachige Domänenmodell ab?
- 25. So rufen Sie Parameter ab, wenn Sie die Apache Commons CLI-Bibliothek verwenden
- 26. So rufen Sie Daten aus der Firebase-Datenbank ab?
- 27. So rufen Sie eine Funktion aus einer Reihe von Funktionen und rufen Sie
- 28. Rufen Sie den Anzeigenamen aus der web.xml-Datei ab
- 29. So rufen Sie die Dateien des Versionselementes in TFS ab
- 30. Rufen Sie Text ab, während Sie auf jschart-Objekt klicken
Was meinst du mit „und in der Lage sein Lese auch die Eingabe "? – malbarbo
Ich meine, wenn Sie ein Programm von der Kommandozeile starten: './Myprog ', sehr oft wartet das Programm auf die Eingabe einiger Daten, zum Beispiel, wenn es ein Kommandozeilenspiel ist, kann es eine Nummer fragen. Wenn ich Command :: new() benutze, wird es sofort beendet, wenn es sich zum Beispiel um eine 'read_line' handelt. Keine Zeit, etwas einzugeben. Ich meine, ich möchte wirklich so handeln, als hätte ich das Programm von der Kommandozeile aus ausgeführt. – x4rkz