2012-10-17 19 views
57

W pliku node.js chciałbym znaleźć sposób uzyskania wyniku polecenia terminala systemu Unix. Czy jest jakiś sposób to zrobić?Uzyskaj wynik polecenia powłoki w pliku 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

Czy to duplikat, czy też opisać coś zupełnie innego? http://stackoverflow.com/questions/7183307/node-js-execute-command-synchronously-and-get-result –

+0

[This] (http://davidwalsh.name/sync-exec) może Cię zainteresować. – benekastah

Odpowiedz

80

Tak właśnie postępuję w projekcie, nad którym pracuję.

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

Przykład: Odzyskiwanie użytkownik 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

Czy ta funkcja może zwrócić dane wyjściowe polecenia? (To właśnie próbowałem zrobić.) –

+1

to właśnie robi ten kod. spójrz na przykład przy edycji, którą właśnie utworzyłem – renatoargh

+2

@AndersonGreen Nie chciałbyś, aby funkcja powracała normalnie z klawiaturą "return", ponieważ uruchamia ona asynchronicznie komendę powłoki. W rezultacie lepiej jest przekazać wywołanie zwrotne z kodem, który powinien zostać uruchomiony po ukończeniu polecenia powłoki. –

18

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

jak podkreślił Renato, istnieją pewne synchroniczne pakiety Exec tam teraz też zobaczyć sync-exec, że może być więcej, co yo're szukam. Pamiętaj jednak, że plik node.js ma być pojedynczym, gwintowanym serwerem sieci o wysokiej wydajności, więc jeśli chcesz go używać, trzymaj się z dala od sync-exec, chyba że używasz go tylko podczas uruchamiania lub coś.

+1

W takim przypadku w jaki sposób mogę uzyskać dane wyjściowe polecenia? Czy "stdout" zawiera dane wyjściowe wiersza polecenia? –

+0

Czy można zrobić coś podobnego bez korzystania z oddzwaniania? –

+0

Prawidłowe, stdout zawiera dane wyjściowe programu. I nie, nie można tego zrobić bez wywołań zwrotnych. Wszystko w węźle node.js jest zorientowane na to, że nie jest blokujące, co oznacza, że ​​za każdym razem, gdy robisz IO, będziesz używał wywołań zwrotnych. – hexist

Powiązane problemy