PHP执行grep命令时--exclude-dir多目录排除失效问题排查
PHP执行grep命令时--exclude-dir多目录不生效的问题
问题原因
终端里执行grep -rn --exclude-dir={img,node_modules,vendor} -E "14847"能生效,是因为bash这类shell会自动把大括号{img,node_modules,vendor}扩展成三个独立的--exclude-dir参数(即--exclude-dir=img --exclude-dir=node_modules --exclude-dir=vendor)。但PHP的反引号执行运算符默认调用的是sh而非bash,而sh不支持大括号扩展语法,导致grep收到的是一个完整的--exclude-dir={img,node_modules,vendor}参数,无法识别多个目录,自然排除不了node_modules。
解决办法
方法1:拆分多个--exclude-dir参数
直接把大括号语法替换成多个独立的--exclude-dir选项,这是最直接的方式:
print `grep -rn --exclude-dir=img --exclude-dir=node_modules --exclude-dir=vendor -E "14847"`;
方法2:指定用bash执行命令
强制让PHP调用bash来解析命令,利用bash的大括号扩展功能:
print `bash -c 'grep -rn --exclude-dir={img,node_modules,vendor} -E "14847"'`;
注意这里要用单引号包裹grep命令,避免PHP或sh解析内部的引号和大括号。
方法3:用find命令配合grep(替代方案)
如果不想依赖shell扩展,也可以用find先过滤目录,再传给grep:
print `find . -type f \( -path "./img/*" -o -path "./node_modules/*" -o -path "./vendor/*" \) -prune -o -exec grep -n "14847" {} +`;
这个命令会先排除指定目录,再对剩余文件执行grep搜索。
内容的提问来源于stack exchange,提问作者tczx3
相关产品推荐
相关产品推荐

