2012-10-17 8 views
57

In un nodo.js, mi piacerebbe trovare un modo per ottenere l'output di un comando terminale Unix. C'è un modo per fare questo?Ottieni l'output di un comando shell in node.js

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

Si tratta di un duplicato, o esso descrive qualcosa di completamente diverso? http://stackoverflow.com/questions/7183307/node-js-execute-command-synchronously-and-get-result –

+0

[Questo] (http://davidwalsh.name/sync-exec) potrebbe interessarti. – benekastah

risposta

80

Questo è il modo in cui lo faccio in un progetto che sto lavorando ora.

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

Esempio: Recupero utente 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", "") }); 
     }); 
    }); 
}; 
+0

È possibile fare in modo che questa funzione restituisca l'output del comando? (Questo è quello che stavo cercando di fare.) –

+1

questo è ciò che fa quel codice. guarda l'esempio alla modifica che ho appena creato – renatoargh

+2

@AndersonGreen Non vorrai che la funzione ritorni normalmente con la tastiera "return", perché esegue il comando shell in modo asincrono. Di conseguenza, è meglio passare una richiamata con codice che deve essere eseguito quando il comando della shell è completo. –

18

Siete alla ricerca di 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); 
     } 
    }); 

Come sottolineato da Renato, ci sono alcuni pacchetti exec sincroni là fuori ormai troppo, vedere sync-exec che potrebbe essere più quello yo're cercando. Tuttavia, node.js è progettato per essere un server di rete ad alte prestazioni a thread singolo, quindi se questo è quello che stai cercando di usarlo, stai lontano da roba di tipo sync-exec a meno che tu non lo stia usando solo all'avvio o qualcosa.

+1

In questo caso, come posso ottenere l'output del comando? È "stdout" che contiene l'output della riga di comando? –

+0

Inoltre, è possibile fare qualcosa di simile senza usare una richiamata? –

+0

Corretto, stdout contiene l'output del programma. E no, non è possibile farlo senza richiamate. Tutto in node.js è orientato all'essere non-bloccante, il che significa che ogni volta che fai l'IO, utilizzerai le callback. – hexist

Problemi correlati