Gitbash执行Drush sqlq命令遇引号匹配EOF错误,请求排查
解决Git Bash中Drush SQL查询命令的引号解析错误
我之前也踩过Git Bash里Drush命令引号解析的坑,你的问题根源在于Git Bash对双引号的处理逻辑和标准Unix shell(比如Linux的bash)不一致,导致SQL语句的引号被提前拆解,Drush收到的参数不完整,从而抛出引号不匹配的EOF错误。而像drush @site cc all这类没有引号的简单命令,不需要处理引号转义,所以能正常执行。
这里有几个可靠的解决方案,你可以按情况尝试:
方案1:转义双引号
在Git Bash中,你需要用反斜杠\转义SQL语句外层的双引号,让Git Bash把完整的带引号的SQL语句传递给Drush:
drush @site sqlq \"select * from tablename\"
方案2:改用单引号包裹SQL语句
Git Bash对单引号的处理更贴近标准shell,直接用单引号包裹SQL语句就能避免解析问题:
drush @site sqlq 'select * from tablename'
如果你的SQL语句本身包含单引号(比如select * from users where name='admin'),可以把内部的单引号转义为\',或者用双引号包裹整个语句并转义内部双引号,比如:
drush @site sqlq "select * from users where name='admin'" # 或者 drush @site sqlq 'select * from users where name=\'admin\''
方案3:使用Here文档(适合复杂SQL)
如果你的SQL语句很长或者包含多种引号,可以用Here文档的方式传递,避免引号冲突:
drush @site sqlq << 'EOF' select * from tablename where created > 1600000000 and status = 1 EOF
注意这里的EOF前后不要有多余空格,并且单引号包裹的EOF会让Git Bash不解析内部的变量或转义字符,确保SQL原封不动传递给Drush。
这些方法都能解决Git Bash下的引号解析问题,你可以根据自己的SQL复杂度选择合适的方式。
内容的提问来源于stack exchange,提问作者Prachit Patil




