我想在 node.js 中执行类似“doSomething ./myfiles/*.csv”的命令。我想使用 spawn 而不是 exec,因为它是某种监视进程,我需要 stdout 输出。
我试过了
var spawn = require('child_process').spawn;
spawn("doSomething", ["./myfiles/*.csv"]);
但是通配符 *.csv 将不会被解释。
使用 spawn() 时不能使用通配符吗?有没有其他方法可以解决这个问题?
谢谢
托本
最佳答案
*
正在由 shell 扩展,而对于 child_process.spawn
,参数作为字符串传入,因此永远不会正确扩展。这是 spawn
的限制。您可以尝试 child_process.exec
代替,它将允许 shell 正确扩展任何通配符:
var exec = require("child_process").exec;
var child = exec("doSomething ./myfiles/*.csv",function (err,stdout,stderr) {
// Handle result
});
如果您出于某种原因确实需要使用 spawn
,也许您可以考虑在 Node 中使用 node-glob 之类的库自己扩展通配 rune 件模式。在创建子进程之前?
更新
在 Joyent Node 核心代码中,我们可以观察到通过 spawn
在 shell 中调用任意命令的方法,同时保留完整的 shell 通配符扩展:
这是一些伪代码:
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]);
}
关于node.js - child_process spawn() 中的通配符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11717281/