使用find查找含BOM的SQL文件时报paths must precede expression错误如何解决
问题排查与解决
核心错误原因
- 普通字符串无法正确存储带特殊符号/通配符的多命令参数:你定义
parametros="-type f -name "*.sql""时双引号嵌套失效,*.sql会被Shell在执行find命令前提前展开为当前目录下所有匹配的.sql文件名,就像你报错信息里出现的ComBOM.sql ComVirgula.sql SemBOM.sql被直接插入到了find参数中,直接破坏了find的语法结构。 - 外层包裹的
$(...)完全多余:会把find的输出结果(也就是匹配到的带BOM的文件路径)当成Shell命令再次执行,引发额外的未知错误。
修复方案
Bash中存储多命令参数的标准做法是使用数组,修复后完整脚本如下:
#!/bin/bash set -x printf '\nStart!\n' caminho="$PWD" # 用数组存储find参数,避免通配符提前展开和分词问题 parametros=(-type f -name '*.sql') # 直接执行find命令,不要用$()包裹 find "${caminho}" "${parametros[@]}" -exec grep -l $'\xEF\xBB\xBF' {} \;
如果不需要单独存参数,也可以直接简化为更短的写法:
#!/bin/bash printf '\nStart!\n' find "$PWD" -type f -name '*.sql' -exec grep -l $'\xEF\xBB\xBF' {} \;
内容的提问来源于stack exchange,提问作者Pablo Sarturi
相关产品推荐
相关产品推荐

