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不爲 「CD」 殼CMD攜手。正如你在下面看到的,pwd工作,git status正在嘗試工作,但因爲它不在git目錄中執行而失敗,但是cd cmd無法停止進一步成功執行其他cmd。 嘗試在nodeJS外殼以及nodeJS + ExpressJS網絡服務器。高管的NodeJS不爲 「CD」 殼CMD

回答

39

每個命令都在一個單獨的shell中執行,因此第一個cd隻影響那個終止的shell進程。如果你想在一個特定的目錄中運行git,只是還節點爲您設置的路徑:

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

cwd(當前工作目錄)是many options available for exec之一。

0

而不是調用exec()多次。爲多個命令調用exec()一次

您的shell正在執行cd,但它只是在每個shell完成後將其移出工作目錄。因此,你回到了原點。

就你而言,你不需要多次調用exec()。您可以確保您的cmd變量包含多個指令而不是1.在此情況下,CD 將會工作

var cmd = `ls 
cd foo 
ls` 

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

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

注意:此代碼應在Linux,但不能在Windows工作。見here