2016-06-09 4 views
4

Ich kann ein Bash-Befehl in node.js laufen wie folgt:in Node.js und bekommen Exit-Code

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); 
}); 

Wie erhalte ich den Exit-Code des Befehls (ls -la in diesem Beispiel) ? Ich habe versucht zu laufen

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

Dies irgendwie immer zurück 0 unabhängig von der Exit-Code des vorherigen Befehls obwohl. Was vermisse ich?

+0

Ihr erstes Beispiel gibt Ihnen bereits die stdout in der console.log – Manatax

Antwort

11

Diese 2 Befehle laufen in separaten Shells. Um den Code zu erhalten, sollten Sie err.code in Ihrem Rückruf überprüfen können.

Wenn das nicht funktioniert, müssen Sie einen exit Event-Handler

zum Beispiel hinzufügen

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 
}); 
+1

Awesome! Der Event-Handler 'exit' funktioniert gut; 'err.code' gibt nur eine Nummer zurück, wenn der Fehlercode nicht 0 ist. – mbacvanski

1

In Knoten Dokumentation fand ich diese Informationen für die Callback-Funktion:

Bei Erfolg wird Fehler null sein. Bei einem Fehler wird der Fehler eine Instanz von Fehler sein. Die Eigenschaft error.code ist der Beendigungscode des untergeordneten Prozesses, während error.signal auf das Signal gesetzt wird, das den Prozess beendet hat. Ein anderer Beendigungscode als 0 wird als Fehler betrachtet.

2

Aus der Dokumentation:

Wenn eine callback Funktion vorgesehen ist, wird es mit den Argumenten aufgerufen (error, stdout, stderr). Bei Erfolg wird errornull sein. Bei einem Fehler wird error eine Instanz von Fehler sein. Die Eigenschaft ist der Beendigungscode des untergeordneten Prozesses, während error.signal auf das Signal gesetzt wird, das den Prozess beendet hat. Ein anderer Beendigungscode als 0 wird als Fehler betrachtet.

So:

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

Sollte funktionieren.