2013-03-26 15 views
18
var sys = require('sys'), 
    exec = require('child_process').exec; 

exec("cd /home/ubuntu/distro", function(err, stdout, stderr) { 
     console.log("cd: " + err + " : " + stdout); 
     exec("pwd", function(err, stdout, stderr) { 
      console.log("pwd: " + err + " : " + stdout); 
      exec("git status", function(err, stdout, stderr) { 
       console.log("git status returned "); console.log(err); 
      }) 
     }) 
    }) 

cd: null : 

pwd: null :/

git status returned 
{ [Error: Command failed: fatal: Not a git repository (or any of the parent directories): .git ] killed: false, code: 128, signal: null } 

nodeJS exec non funziona per cmd shell "cd". come vedete in seguito, pwd funziona, git status sta cercando di funzionare ma fallisce perché non viene eseguito in una directory git, ma cd cmd non riesce a fermare l'ulteriore successo dell'esecuzione di altri cmds. Provato nella shell nodeJS e nel server web nodeJS + ExpressJS.nodeJS exec non funziona per "cd" cmd shell

risposta

39

Ogni comando viene eseguito in una shell separata, quindi il primo cd riguarda solo il processo della shell che termina. Se si desidera eseguire git in una particolare directory, basta avere Nodo impostare il percorso per voi:

exec('git status', {cwd: '/home/ubuntu/distro'}, /* ... */); 

cwd (directory corrente) è uno dei many options available for exec.

0

Invece di chiamata exec() più volte. exec call() una volta per comandi multipli

La shell sta eseguendo cd ma è solo che ogni shell butta via directory che sta funzionando dopo che è finito. Quindi sei di nuovo al punto di partenza.

Nel tuo caso, non è necessario chiamare exec() più di una volta. Puoi assicurarti che la tua variabile cmd contenga più istruzioni invece di 1. Il CD sarà in questo caso il.

var cmd = `ls 
cd foo 
ls` 

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

exec(cmd, function(err, stdout, stderr) { 
     console.log(stdout); 
}) 

Nota: Questo codice dovrebbe funzionare su Linux, ma non di Windows. Vedi here

Problemi correlati