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

为什么会这样工作:

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

但是这会引发一个错误:

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

它抛出的Error: spawn ENOENTError: spawn ENOENT

起初我以为这可能与env ,但是execspawn.完全一样spawn. 我认为它必须以某种方式与Grunt有关,因为尝试git在两个工程。

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

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

env中exec的默认选项是null ,但是对于spawn,它是process.env 。 所以,如果两者都得到相同的env是不明确的? 你可以通过给两个明确的env来检查。

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

我跟着isaacsbuild议:

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

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