Exécuter et obtenir la sortie d’une commande shell dans node.js

Dans un node.js, j’aimerais trouver un moyen d’obtenir la sortie d’une commande de terminal Unix. Est-ce qu’il y a un moyen de faire ça?

function getCommandOutput(commandSsortingng){ // now how can I implement this function? // getCommandOutput("ls") should print the terminal output of the shell command "ls" } 

C’est comme ça que je le fais dans un projet que je travaille maintenant.

 var exec = require('child_process').exec; function execute(command, callback){ exec(command, function(error, stdout, stderr){ callback(stdout); }); }; 

Exemple: Récupération de l’utilisateur git

 module.exports.getGitUser = function(callback){ execute("git config --global user.name", function(name){ execute("git config --global user.email", function(email){ callback({ name: name.replace("\n", ""), email: email.replace("\n", "") }); }); }); }; 

Vous recherchez child_process

 var exec = require('child_process').exec; var child; child = exec(command, function (error, stdout, stderr) { console.log('stdout: ' + stdout); console.log('stderr: ' + stderr); if (error !== null) { console.log('exec error: ' + error); } }); 

Comme l’a souligné Renato, il existe à l’heure actuelle des paquets d’exécution synchrones, voir sync-exec qui pourrait être ce que vous cherchez. Gardez à l’esprit que node.js est conçu pour être un serveur réseau haute performance avec un seul thread, donc si c’est ce que vous cherchez à l’utiliser, restz loin de la synchronisation-exécution à moins que vous ne l’utilisiez qu’au démarrage ou quelque chose.

Si vous utilisez un noeud au- promisify de 7.6 et que vous n’aimez pas le style de rappel, vous pouvez également utiliser la fonction promisify de node-util avec async / await promisify pour obtenir des commandes shell qui lisent correctement. Voici un exemple de la réponse acceptée, en utilisant cette technique:

 const { promisify } = require('util'); const exec = promisify(require('child_process').exec) module.exports.getGitUser = async function getGitUser () { const name = await exec('git config --global user.name') const email = await exec('git config --global user.email') return { name, email } }; 

Cela présente également l’avantage de renvoyer une promesse rejetée sur les commandes ayant échoué, qui peuvent être traitées avec try / catch dans le code asynchrone.

Grâce à Renato, j’ai créé un exemple très simple:

 const exec = require('child_process').exec exec("git config --global user.name", (err, stdout, stderr) => console.log(stdout))