2016-09-06 13 views
10

से साइगविन कमांड निष्पादित करें नोड के child_process मॉड्यूल का उपयोग करके, मैं साइगविन खोल के माध्यम से आदेश निष्पादित करना चाहता हूं। यह मैं क्या कोशिश कर रहा हूँ है:नोडजेएस

var exec = require('child_process').execSync; 
exec('mkdir -p a/b/c', {shell : 'c:/cygwin64/bin/bash.exe -c'}); 
 
TypeError: invalid data 
    at WriteStream.Socket.write (net.js:641:11) 
    at execSync (child_process.js:503:20) 
    at repl:1:1 
    at REPLServer.defaultEval (repl.js:262:27) 
    at bound (domain.js:287:14) 
    at REPLServer.runBound [as eval] (domain.js:300:12) 
    at REPLServer. (repl.js:431:12) 
    at emitOne (events.js:82:20) 
    at REPLServer.emit (events.js:169:7) 
    at REPLServer.Interface._onLine (readline.js:212:10) 

मैं Node's child_process.js will add the /s and /c switches देख सकते हैं, shell विकल्प सेट किया जा रहा है की परवाह किए बिना, bash.exe क्या इन तर्कों से कोई लेना देना नहीं जानता है।

मैं इस समस्या के लिए चारों ओर एक काम मिल गया लेकिन यह वास्तव में आदर्श नहीं है:

exec('c:/cygwin64/bin/bash.exe -c "mkdir -p a/b/c"'); 

ऊपर कर स्पष्ट रूप से केवल Windows नहीं यूनिक्स सिस्टम पर काम करेगा।

मैं नोडजेएस से सिग्विन खोल में कमांड कैसे निष्पादित कर सकता हूं?

उत्तर

2

यह एक पूर्ण सामान्य समाधान है, क्योंकि अधिक exec() के विकल्पों में से कुछ के साथ किया जा करने की आवश्यकता होगी नहीं है, लेकिन यह बाद में बीच फर्क है, तो आप कोड उस पर Unixes, Windows और cygwin काम करेंगे लिखने के लिए अनुमति चाहिए दो।

यह समाधान मानता है कि सिग्विन निर्देशिका में स्थापित है जिसमें नाम cygwin स्ट्रिंग शामिल है।

var child_process = require('child_process') 
    , home = process.env.HOME 
; 

function exec(command, options, next) { 
    if(/cygwin/.test(home)) { 
    command = home.replace(/(cygwin[0-9]*).*/, "$1") + "\\bin\\bash.exe -c '" + command.replace(/\\/g, '/').replace(/'/g, "\'") + "'"; 
    } 

    child_process.exec(command, options, next); 
} 

आप वैकल्पिक रूप से सशर्त child_process.exec अपहरण सकता है जब Cygwin के तहत चल रहा:

var child_process = require('child_process') 
    , home = process.env.HOME 
; 

if(/cygwin/.test(home)) { 
    var child_process_exec = child_process.exec 
    , bash = home.replace(/(cygwin[0-9]*).*/, "$1") + "\\bin\\bash.exe" 
    ; 

    child_process.exec = function(command, options, next) { 
    command = bash + " -c '" + command.replace(/\\/g, '/').replace(/'/g, "\'") + "'"; 

    child_process_exec(command, options, next) 
    } 
}