In einer node.js möchte ich einen Weg finden, um die Ausgabe eines Unix-Terminalbefehls zu erhalten. Gibt es eine Möglichkeit, dies zu tun?
function getCommandOutput(commandString){
// now how can I implement this function?
// getCommandOutput("ls") should print the terminal output of the shell command "ls"
}
node.js
shell
command-line-interface
Anderson Green
quelle
quelle
Antworten:
So mache ich das in einem Projekt, an dem ich gerade arbeite.
Beispiel: Git-Benutzer abrufen
quelle
stdout
wenn ein Fehler vorliegt. Hoffentlich deterministisch und dokumentiert.Sie suchen nach child_process
Wie Renato hervorhob, gibt es jetzt auch einige synchrone Exec-Pakete, siehe Sync-Exec , die möglicherweise mehr das sind, wonach Sie suchen. Beachten Sie jedoch, dass node.js als Hochleistungs-Netzwerkserver mit einem Thread konzipiert ist. Wenn Sie ihn also verwenden möchten, sollten Sie sich von Sync-Exec-Dingen fernhalten, es sei denn, Sie verwenden ihn nur während des Startvorgangs oder so.
quelle
Sync
Methoden nativ verfügbar, auch so sollte es meiner Meinung nach vermieden werdenWenn Sie den Knoten später als 7.6 verwenden und den Rückrufstil nicht mögen, können Sie auch die
promisify
Funktion von node-util verwendenasync / await
, um Shell-Befehle abzurufen, die sauber gelesen werden. Hier ist ein Beispiel für die akzeptierte Antwort mit dieser Technik:Dies hat auch den zusätzlichen Vorteil, dass ein abgelehntes Versprechen für fehlgeschlagene Befehle zurückgegeben wird, das
try / catch
innerhalb des asynchronen Codes verarbeitet werden kann.quelle
{ stdout: string, stderr: string }
als Ergebnis für dieawait exec(...)
return { name: name.stdout.trim(), email: email.stdout.trim() }
.Dank der Antwort von Renato habe ich ein wirklich einfaches Beispiel erstellt:
Es wird nur Ihr globaler Git-Benutzername gedruckt :)
quelle
Bedarf
Dies erfordert Node.js 7 oder höher mit Unterstützung für Promises und Async / Await.
Lösung
Erstellen Sie eine Wrapper-Funktion, die Versprechen nutzt, um das Verhalten des
child_process.exec
Befehls zu steuern .Erläuterung
Mit Versprechungen und einer asynchronen Funktion können Sie das Verhalten einer Shell nachahmen, die die Ausgabe zurückgibt, ohne in eine Callback-Hölle zu geraten, und mit einer hübschen, ordentlichen API. Mit dem
await
Schlüsselwort können Sie ein Skript erstellen, das leicht zu lesen ist und dennoch die Arbeitchild_process.exec
erledigt.Codebeispiel
Verwendung
Beispielausgabe
Probieren Sie es online aus.
Repl.it .
Externe Ressourcen
Versprechen .
child_process.exec
.Node.js Support-Tabelle .
quelle