Ich brauche in node.js Funktion
result = execSync('node -v');
das wird synchron die gegebene Befehlszeile ausgeführt werden und kehren alle stdout'ed von diesem Befehlstext.
ps. Die Synchronisierung ist falsch. Ich weiß. Nur für den persönlichen Gebrauch.
AKTUALISIEREN
Jetzt haben wir die Lösung von mgutz, die uns den Exit-Code gibt, aber nicht stdout! Ich warte immer noch auf eine genauere Antwort.
AKTUALISIEREN
mgutz hat seine Antwort aktualisiert und die Lösung ist hier :)
Wie dgo.a bereits erwähnt hat, gibt es auch ein eigenständiges Modul exec-sync
UPDATE 30.07.2014
ShellJS lib ist angekommen. Betrachten Sie dies als die beste Wahl für den Moment.
UPDATE 10.02.2015
ZU GUTER LETZT! NodeJS 0.12 unterstützt execSync
nativ.
Siehe offizielle Dokumente
Antworten:
Node.js (seit Version 0.12 - also für eine Weile) unterstützt
execSync
:Sie können dies jetzt direkt tun:
und es wird tun, was Sie erwarten. (Standardmäßig werden die E / A-Ergebnisse an den übergeordneten Prozess weitergeleitet.) Beachten Sie, dass Sie auch
spawnSync
jetzt können.quelle
Siehe execSync- Bibliothek.
Mit Node-ffi ist das ziemlich einfach . Ich würde es nicht für Serverprozesse empfehlen, aber für allgemeine Entwicklungsdienstprogramme werden die Dinge erledigt. Installieren Sie die Bibliothek.
Beispielskript:
[EDIT Jun 2012: Wie bekomme ich STDOUT]
quelle
stdout
davon zu erhalten? Alles was ich bekommen kann ist der Prozess-Exit-CodeexecSync
nicht Teil von istchild_process
. Ich denke, das sollte es sein.Verwenden Sie das ShellJS- Modul.
Exec- Funktion ohne Rückruf.
Beispiel:
quelle
exec()
für lange Prozesse CPU-intensiv ist.const execSync = require('child_process').execSync; code = execSync('node -v');
In node.js gibt es ein hervorragendes Modul zur Flusskontrolle namens asyncblock . Wenn das Umschließen des Codes in eine Funktion für Ihren Fall in Ordnung ist, kann das folgende Beispiel in Betracht gezogen werden:
quelle
exec-sync
oderffi
unter Windows hat einen enormen Overhead (VC ++, SDKs, Python usw.), der jedoch leichter ist.Dies ist in Node.js nicht möglich
child_process.spawn
undchild_process.exec
wurde von Grund auf asynchron erstellt.Für Details siehe: https://github.com/ry/node/blob/master/lib/child_process.js
Wenn Sie diese Blockierung wirklich möchten, dann setzen Sie alles, was danach passieren muss, in einen Rückruf oder erstellen Sie eine eigene Warteschlange, um dies blockierend zu behandeln. Ich nehme an, Sie könnten Async.js verwenden für diese Aufgabe verwenden.
Oder, falls Sie viel zu viel Zeit haben, hacken Sie in Node.js selbst herum.
quelle
Dies ist der einfachste Weg, den ich gefunden habe:
quelle
Nur um das hinzuzufügen, obwohl es nur wenige Anwendungsfälle gibt, in denen Sie sie verwenden sollten, wurden
spawnSync
/execFileSync
/execSync
in diesen Commits zu node.js hinzugefügt: https://github.com/joyent/node/compare/d58c206862dc...e8df2676748equelle
Sie können dies mit Fasern erreichen. Wenn Sie beispielsweise meine Common Node-Bibliothek verwenden , sieht der Code folgendermaßen aus:
quelle
Ich gewöhne mich daran,
"synchronous"
Dinge am Ende der Rückruffunktion zu implementieren . Nicht sehr schön, aber es funktioniert. Wenn Sie eine Folge von Befehlszeilenausführungen implementieren müssen, müssen Sieexec
in eine benannte Funktion einbrechen und diese rekursiv aufrufen. Dieses Muster scheint für mich brauchbar zu sein:quelle
Ich hatte ein ähnliches Problem und schrieb schließlich eine Knotenerweiterung dafür. Sie können das Git-Repository auschecken. Es ist Open Source und kostenlos und all das gute Zeug!
https://github.com/aponxi/npm-execxi
Gebrauchsanweisungen finden Sie in der ReadMe-Datei . Fühlen Sie sich frei, Pull-Anfragen zu stellen oder Probleme einzureichen!
EDIT:
Allerdings gibt es das stdout noch nicht zurück ... Gibt sie nur in Echtzeit aus.Das tut es jetzt.Nun, ich habe es heute gerade veröffentlicht. Vielleicht können wir darauf aufbauen.Jedenfalls dachte ich, es lohnt sich, es zu erwähnen.
quelle
npm install
es erfolgreich ist (mit anderen Worten, wenn Plugins kompiliert werden), ist es gut, für die Produktion zu gehen. Abgesehen davon, dass es auf verschiedene NodeJS-Versionen abzielt, würde ich sagen, dass es für die Produktion gepatcht ist oder dass es ziemlich stabil ist. Wenn es irgendwelche Fehler gibt, können Sie eine Pull-Anfrage senden oder ein Problem bei github posten :)Sie können synchrone Shell-Operationen in NodeJs wie folgt ausführen:
BEARBEITEN - Dieses Beispiel ist für Windows-Umgebungen gedacht. Passen Sie es bei Bedarf an Ihre eigenen Linux-Anforderungen an
quelle
Ich hatte tatsächlich eine Situation, in der ich mehrere Befehle nacheinander von einem package.json-Vorinstallationsskript aus ausführen musste, so dass es sowohl unter Windows als auch unter Linux / OSX funktioniert, sodass ich mich nicht auf ein Nicht-Core-Modul verlassen konnte.
Das habe ich mir also ausgedacht:
Sie können es so verwenden:
BEARBEITEN: Wie bereits erwähnt, wird dadurch weder die Ausgabe zurückgegeben noch das Ergebnis der Befehle in einem Knotenprogramm verwendet. Eine andere Idee dafür ist die Verwendung von LiveScript-Backcalls. http://livescript.net/
quelle