2013-03-26 4 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 कार्यकारी "सीडी" खोल cmd के लिए काम नहीं करता है के लिए काम नहीं करता। जैसा कि आप नीचे देखते हैं, pwd works, गिट स्थिति काम करने की कोशिश कर रही है लेकिन विफल हो जाती है क्योंकि इसे गिट निर्देशिका में निष्पादित नहीं किया जाता है, लेकिन सीडी cmd अन्य cmds के आगे सफल निष्पादन को रोकने में विफल रहता है। नोडजेएस खोल के साथ-साथ नोडजेएस + एक्सप्रेसजेएस वेबसर्वर में कोशिश की।NodeJS कार्यकारी "सीडी" खोल cmd

उत्तर

39

प्रत्येक आदेश को एक अलग खोल में निष्पादित किया जाता है, इसलिए पहले cd केवल उस खोल प्रक्रिया को प्रभावित करता है जो तब समाप्त हो जाता है।

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

cwd (वर्तमान कार्यशील निर्देशिका) many options available for exec में से एक है: आप एक विशेष निर्देशिका में git चलाना चाहते हैं, बस नोड आप के लिए पथ निर्धारित किया है।

0

बजाय कॉल कार्यकारी() कई बार:

विकल्प यहां दिए कि मदद कर सकते हैं कर रहे हैं। एकाधिक आदेशों के लिए एक बार कॉल निष्पादन (0)

आपका खोल cd निष्पादित कर रहा है लेकिन यह केवल इतना है कि प्रत्येक खोल समाप्त होने के बाद यह कार्यशील निर्देशिका को फेंकता है। इसलिए आप वापस वर्ग एक पर हैं।

आपके मामले में, आपको एक से अधिक बार exec() को कॉल करने की आवश्यकता नहीं है। आप सुनिश्चित कर सकते हैं कि आपके cmd चर के बजाय 1 सीडी इस मामले में काम करेगा।

var cmd = `ls 
cd foo 
ls` 

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

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

नोट: इस कोड लिनक्स नहीं बल्कि विंडोज पर काम करना चाहिए। here

देखें