2016-09-06 11 views
10

Korzystając z modułu węzła child_process, chciałbym wykonywać polecenia przez powłokę cygwin. To jest to, co usiłuję:Wykonanie komendy cygwin z NodeJS

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) 

widzę Node's child_process.js will add the /s and /c switches, niezależnie od opcji shell ustawiany, bash.exe nie wie, co zrobić z tymi argumentami.

znalazłem pracę wokół tego problemu, ale to naprawdę nie jest idealny:

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

robi powyżej, oczywiście nie tylko działa na systemach Unix Windows.

Jak mogę wykonywać polecenia w powłoce cygwin z NodeJS?

Odpowiedz

2

To nie jest kompletne ogólne rozwiązanie, ponieważ więcej trzeba będzie zrobić z niektórymi opcjami exec(), ale powinno to pozwolić na napisanie kodu, który będzie działał na Uniksach, Windows i cygwin, rozróżniając późniejszy dwa.

To rozwiązanie zakłada, że ​​Cygwin jest zainstalowany w katalogu, którego nazwa zawiera ciąg 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); 
} 

Można alternatywnie porwać child_process.exec warunkowo, gdy uruchomiony pod 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) 
    } 
}