J'ai besoin de la fonction node.js
result = execSync('node -v');
qui exécutera de manière synchrone la ligne de commande donnée et retournera tous les stdout'ed par ce texte de commande.
ps. La synchronisation est incorrecte. Je connais. Juste pour un usage personnel.
METTRE À JOUR
Nous avons maintenant la solution de mgutz qui nous donne le code de sortie, mais pas stdout! En attente d'une réponse plus précise.
METTRE À JOUR
mgutz a mis à jour sa réponse et la solution est ici :)
De plus, comme dgo.a l'a mentionné, il existe un module autonome exec-sync
MISE À JOUR 30/07/2014
La librairie ShellJS est arrivée. Considérez que c'est le meilleur choix pour le moment.
MISE À JOUR 10/02/2015
ENFIN! NodeJS 0.12 prend execSync
en charge nativement.
Voir la documentation officielle
Réponses:
Node.js (depuis la version 0.12 - donc pendant un certain temps) prend en charge
execSync
:Vous pouvez maintenant le faire directement:
et il fera ce que vous attendez. (Par défaut pour diriger les résultats d'E / S vers le processus parent). Notez que vous pouvez également
spawnSync
maintenant.la source
Voir la bibliothèque execSync .
C'est assez facile à faire avec node-ffi . Je ne recommanderais pas les processus de serveur, mais pour les utilitaires de développement généraux, cela fait avancer les choses. Installez la bibliothèque.
Exemple de script:
[EDIT Jun 2012: Comment obtenir STDOUT]
la source
stdout
ce soit? Tout ce que je peux obtenir est le code de sortie du processusexecSync
ne fait pas partie dechild_process
. Je pense que ça devrait l'être.Utilisez le module ShellJS .
exec fonction sans fournir de rappel.
Exemple:
la source
exec()
est gourmand en CPU pour les processus longs.const execSync = require('child_process').execSync; code = execSync('node -v');
Il existe un excellent module de contrôle de flux dans node.js appelé asyncblock . Si l'encapsulation du code dans une fonction convient à votre cas, l'exemple suivant peut être envisagé:
la source
exec-sync
ouffi
sur Windows a une surcharge énorme (VC ++, SDK, Python, etc.), mais c'est plus léger.Cela n'est pas possible dans Node.js, à la fois
child_process.spawn
etchild_process.exec
ont été construits à partir de zéro pour être asynchrones.Pour plus de détails, voir: https://github.com/ry/node/blob/master/lib/child_process.js
Si vous voulez vraiment avoir ce blocage, mettez tout ce qui doit se passer par la suite dans un rappel, ou créez votre propre file d'attente pour gérer cela de manière bloquante, je suppose que vous pouvez utiliser Async.js pour cette tâche.
Ou, au cas où vous auriez beaucoup trop de temps à passer, piratez vous-même dans Node.js.
la source
C'est le moyen le plus simple que j'ai trouvé:
la source
Juste pour ajouter que même s'il y a peu de cas d'utilisation où vous devriez les utiliser,
spawnSync
/execFileSync
/execSync
ont été ajoutés à node.js dans ces commits: https://github.com/joyent/node/compare/d58c206862dc...e8df2676748ela source
Vous pouvez y parvenir en utilisant des fibres. Par exemple, en utilisant ma bibliothèque Common Node , le code ressemblerait à ceci:
la source
Je m'habitue à implémenter des
"synchronous"
trucs à la fin de la fonction de rappel. Pas très sympa, mais ça marche. Si vous avez besoin d'implémenter une séquence d'exécutions de ligne de commande, vous devez encapsulerexec
dans une fonction nommée et l'appeler récursivement. Ce modèle me semble utilisable:la source
J'ai eu un problème similaire et j'ai fini par écrire une extension de nœud pour cela. Vous pouvez extraire le référentiel git. C'est open source et gratuit et toutes ces bonnes choses!
https://github.com/aponxi/npm-execxi
Les instructions d'utilisation se trouvent dans le fichier ReadMe . N'hésitez pas à faire des pull requests ou à soumettre des problèmes!
EDIT:
Cependant, il ne renvoie pas encore le stdout ... Il suffit de les sortir en temps réel.C'est le cas maintenant.Eh bien, je viens de le publier aujourd'hui. Peut-être pouvons-nous bâtir dessus.Quoi qu'il en soit, j'ai pensé qu'il valait la peine de le mentionner.
la source
npm install
réussit (en d'autres termes que le plugin compile), alors il est bon de passer à la production. En plus de cibler différentes versions de nodejs, je dirais qu'il est corrigé pour la production, ou qu'il est assez stable. S'il y a des bogues, vous pouvez envoyer une pull request ou publier un problème sur github :)vous pouvez faire des opérations shell synchrones dans nodejs comme ceci:
EDIT - cet exemple est destiné aux environnements Windows, ajustez-les pour vos propres besoins Linux si nécessaire
la source
En fait, j'ai eu une situation où je devais exécuter plusieurs commandes l'une après l'autre à partir d'un script de préinstallation package.json d'une manière qui fonctionnerait à la fois sur Windows et Linux / OSX, donc je ne pouvais pas compter sur un module non-core.
Voici donc ce que j'ai proposé:
Vous pouvez l'utiliser comme ceci:
EDIT: comme indiqué, cela ne renvoie pas réellement la sortie ou ne vous permet pas d'utiliser le résultat des commandes dans un programme Node. Une autre idée pour cela est d'utiliser des backcalls LiveScript. http://livescript.net/
la source