child_process spawn()中的通配符?

我想在node.js中执行一个类似“doSomething ./myfiles/*.csv”的命令。 我想使用产卵而不是执行,因为它是某种观察过程,我需要标准输出。

我试过这个

var spawn = require('child_process').spawn; spawn("doSomething", ["./myfiles/*.csv"]); 

但是,通配符* .csv不会被解释。

使用spawn()时不可能使用通配符吗? 还有其他的可能性来解决这个问题吗?

谢谢

托本

*正在通过shell进行扩展,对于child_process.spawn ,参数作为string传递,所以永远不会正确扩展。 这是spawn的限制。 您可以尝试使用child_process.exec ,它将允许shell正确地扩展任何通配符:

 var exec = require("child_process").exec; var child = exec("doSomething ./myfiles/*.csv",function (err,stdout,stderr) { // Handle result }); 

如果你真的需要使用spawn出于某种原因,也许你可以考虑在创buildsubprocess之前使用类似node-glob的lib自己扩展通配符文件模式?

更新

在Joyent Node核心代码中,我们可以观察到一种通过spawn在shell中调用任意命令的方法,同时保留了完整的shell通配符扩展:

https://github.com/joyent/node/blob/937e2e351b2450cf1e9c4d8b3e1a4e2a2def58bb/lib/child_process.js#L589

这里有一些伪代码:

 var child; var cmd = "doSomething ./myfiles/*.csv"; if ('win32' === process.platform) { child = spawn('cmd.exe', ['/s', '/c', '"' + cmd + '"'],{windowsVerbatimArguments:true} ); } else { child = spawn('/bin/sh', ['-c', cmd]); } 

你在使用什么操作系统? 在Unix系列操作系统(例如Linux,MacOS)中,程序希望shell进程扩展通配符文件名参数并在argv[]传递扩展。 在Windows操作系统中,程序通常希望自己扩展通配符(尽pipe只有它们是Windows原生程序;移植的Unix家族程序最多可以尝试通过兼容层来运行参数)。

你的语法看起来像是Unix家族系统。 如果是这样的话,那么当你调用spawn()你正在绕过shell扩展,而你的subprocess将逐字地处理参数中的圆点和星号。 尝试使用sh child_process代替child_process ,看看你是否得到更好的结果。