从NodeJS执行cygwin命令

使用Node的child_process模块,我想通过cygwin shell执行命令。 这就是我想要的:

 var exec = require('child_process').execSync; exec('mkdir -pa/b/c', {shell : 'c:/cygwin64/bin/bash.exe -c'}); 
 TypeError:无效的数据
    在WriteStream.Socket.write(net.js:641:11)
    在execSync(child_process.js:503:20)
    在复制:1:1
    在REPLServer.defaultEval(repl.js:262:27)
    在绑定(domain.js:287:14)
    在REPLServer.runBound [as eval](domain.js:300:12)
    在REPLServer。  (repl.js:431:12)
    在emitOne(events.js:82:20)
    在REPLServer.emit(events.js:169:7)
    在REPLServer.Interface._onLine(readline.js:212:10)

我可以看到Node的child_process.js会添加/s/c开关 ,无论shell设置如何,bash.exe都不知道如何处理这些参数。

我发现了一个解决这个问题的方法,但实际上并不理想:

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

做上述显然只能在Windows而不是Unix系统上工作。

我如何在NodeJS的cygwin shell中执行命令?

这不是一个完整的通用解决scheme,因为需要使用exec()一些选项来完成更多的工作,但是这应该允许你编写在unix,Windows和cygwin上工作的代码,区分后两者。

此解决scheme假定Cygwin安装在一个名称包含stringcygwin的目录中。

 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 ); } 

在Cygwin下运行时,您可以有select地劫持child_process.exec:

 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 ) } }