如何在Node.js的spawn中传递Git pathspec参数
解决child_process.spawn传递git grep路径参数的问题
在使用child_process.spawn时,不需要给路径参数添加单引号,因为spawn会将数组中的每个元素作为独立的命令行参数直接传递给git程序,不会经过shell的分词处理。你之前的错误写法是多余地添加了引号,导致git把带引号的字符串当作路径去查找,自然找不到对应文件。
正确的写法应该是:
spawn('git', ['grep', 'MySearchString', '--', 'MyPathToSearchFor'])
为什么之前的写法会失败?
- 第一种错误写法:
spawn('git', ['grep', 'MySearchString', '--', "'MyPathToSearchFor'"])
git会尝试查找名为'MyPathToSearchFor'(包含单引号)的路径,显然这个路径不存在,所以退出码为1。 - 第二种错误写法:
spawn('git', ['grep', 'MySearchString', "-- 'MyPathToSearchFor'"])
这里把-- 'MyPathToSearchFor'当作了一个单独的参数,git无法识别这个格式的参数,因此退出码为128。
关键区别:exec vs spawn
exec是通过shell来执行命令,所以需要用引号来确保路径作为单个参数被shell解析;spawn直接将参数数组传递给目标程序,每个数组元素对应一个独立的命令行参数,不需要额外的引号或转义。
内容的提问来源于stack exchange,提问作者KurtPreston
相关产品推荐
相关产品推荐

