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