web-dev-qa-db-fra.com

Exécutez la commande bash dans Node.js et obtenez le code de sortie

Je peux exécuter une commande bash dans node.js comme ceci:

var sys = require('sys')
var exec = require('child_process').exec;

function puts(error, stdout, stderr) { sys.puts(stdout) }
exec("ls -la", function(err, stdout, stderr) {
  console.log(stdout);
});

Comment puis-je obtenir le code de sortie de cette commande (ls -la dans cet exemple)? J'ai essayé de courir

exec("ls -la", function(err, stdout, stderr) {
  exec("echo $?", function(err, stdout, stderr) {
    console.log(stdout);
  });
});

Cela revient toujours à 0 quel que soit le code de sortie de la commande précédente. Qu'est-ce que je rate?

32
mbacvanski

Ces 2 commandes sont exécutées dans des coques séparées.

Pour obtenir le code, vous devriez pouvoir vérifier err.code dans votre rappel.

Si cela ne fonctionne pas, vous devez ajouter un gestionnaire d'événements exit

par exemple.

dir = exec("ls -la", function(err, stdout, stderr) {
  if (err) {
    // should have err.code here?  
  }
  console.log(stdout);
});

dir.on('exit', function (code) {
  // exit code is code
});
40
Joe

De la docs:

Si une fonction callback est fournie, elle est appelée avec les arguments (error, stdout, stderr). En cas de succès, error sera null. En cas d'erreur, error sera une instance de Error. Le error.code La propriété sera le code de sortie du processus enfant tandis que error.signal sera réglé sur le signal qui a mis fin au processus. Tout code de sortie autre que 0 est considéré comme une erreur.

Alors:

exec('...', function(error, stdout, stderr) {
  if (error) {
    console.log(error.code);
  }
});

Devrait marcher.

6
andlrc

Dans la documentation du noeud, j'ai trouvé cette information pour la fonction de rappel:

En cas de succès, l'erreur sera nulle. En cas d'erreur, erreur sera une instance de Erreur. La propriété error.code sera le code de sortie du processus enfant tandis que error.signal sera défini sur le signal qui a mis fin au processus. Tout code de sortie autre que 0 est considéré comme une erreur.

1
Borja Tur