1

为什么会这样:

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在两者中都有效。

4

2 回答 2

3

在检查节点文档时,spawn我发现:

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

envin exec的默认选项是null,但 spawn 是process.env。因此,如果两者都相同,这是模棱两可的env吗?env您可以通过为两者明确给出相同的内容来检查这一点。

于 2013-05-16T16:27:30.527 回答
1

我遇到了同样的问题。它只出现在 Windows 平台上。最后,我发现这个问题帮助我摆脱了这些东西。

我遵循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);
}

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

于 2014-08-17T15:13:15.880 回答