为什么调用child_process命令可以使用exec而不是spawn?

时间:2013-05-16 11:48:47

标签: node.js gruntjs child-process

为什么会这样:

var exec = require("child_process").exec;
var command = exec("grunt");

但这会引发错误:

var spawn = require("child_process").spawn;
var command = spawn("grunt");

它引发的错误是Error: spawn ENOENT

起初我认为它可能与env有关,但在execspawn.中完全相同我认为它必须与某些事情有关Grunt,因为尝试git同时适用。

2 个答案:

答案 0 :(得分:3)

在检查spawn的节点docs时,我找到了:

  

请注意,如果spawn收到一个空的选项对象,它将导致   使用空环境而不是使用来生成进程   process.env。这是由于向后兼容性问题   弃用的API。

exec中env的默认选项为null,但对于spawn,它为process.env。如果两者都变得相同env那么它是不明确的?你能否通过明确地为两者提供env来检查这一点。

答案 1 :(得分:1)

我遇到了同样的问题。它只出现在Windows平台上。最后,我发现this issue帮助我解决了这个问题。

我遵循isaacs建议:

  

根据平台,cmd是“sh”或“cmd”,arg是   始终是/ c $ cmd或-c $ cmd。

child = child_process.spawnShell('util.bat glerp gorp', {options...})
     

哪个是糖:

child = child_process.spawn(isWin ? 'cmd' : 'sh', [isWin?'/c':'-c', arg], options)

然后,我写了我自己的简单spawnShell

var spawn = require('child_process').spawn;    
function spawnShell(args,options){
    var isWin = (process.platform === 'win32');
    args.unshift(isWin ? '/c' : '-c');
    return spawn(isWin ? 'cmd' : 'sh', args, options);
}

虽然现在有点晚了,但希望我的回答在未来仍可以帮助其他人。