为什么调用一个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 ENOENT
是Error: spawn ENOENT
起初我以为这可能与env
,但是exec
和spawn.
完全一样spawn.
我认为它必须以某种方式与Grunt有关,因为尝试git
在两个工程。
在检查spawn
的节点文档时 ,我发现:
请注意,如果spawn收到一个空的选项对象,它将导致产生一个空的环境进程,而不是使用process.env。 这是由于与弃用API的向后兼容性问题。
env
中exec的默认选项是null
,但是对于spawn,它是process.env
。 所以,如果两者都得到相同的env
是不明确的? 你可以通过给两个明确的env
来检查。
我遇到了同样的问题。 它只出现在Windows平台上。 最后,我发现这个问题帮助我摆脱了这个问题。
我跟着isaacs
build议:
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); }
虽然有点晚了,希望我的回答在未来仍然可以帮助别人。