【Bug】Windows|Git Bash|grep 报错 Binary file (standard input) matches

Git Bash 中 grep 管道中文乱码问题的解决

在 Windows 的 Git Bash 中使用 grep 管道过滤 Python 程序输出时,遇到了 Binary file (standard input) matches 报错,且 grep -a 强制输出后中文全部乱码。根本原因是程序输出了 ANSI 颜色转义码导致 grep 误判为二进制,同时 Windows 默认的 GBK 编码与 Python 输出的 UTF-8 不匹配导致中文乱码。~/.bashrc 中添加 export PYTHONIOENCODING=utf-8 即可永久解决乱码问题临时使用的话,grep -a 可以绕过二进制检测。

文章目录

问题描述

在 Windows 的 Git Bash 中,将程序输出通过管道传给 grep 时遇到两个问题:

  1. grep 无输出 :程序输出包含 ANSI 颜色转义码,grep 将其识别为二进制文件,直接报 Binary file (standard input) matches
  2. 中文乱码 :加了 grep -a 能看到内容,但中文显示为乱码(如 ȱ□□û□□□ҵ□)。

示例:

bash 复制代码
$ my-python-tool --verbose | grep ERROR
Binary file (standard input) matches

$ my-python-tool --verbose | grep -a ERROR
[ERROR] 模□□□初始化失败□□
[ERROR] □□□□找不到配置文件

原因分析

两个问题各有独立原因:

问题一:Binary file matches

程序输出中包含 ANSI 颜色转义序列(如 \x1b[33m 表示黄色文字),grep 在检测输入时发现非文本字节,将整个输入当作二进制文件处理,因此不会正常输出匹配行。

问题二:中文乱码

Windows 系统默认编码是 GBK(CP936),而现代程序(如 Python)默认输出 UTF-8 编码。Git Bash 的管道在 Windows 上使用系统默认编码传递数据,UTF-8 的中文在 GBK 终端中被错误解码,产生乱码。

两者叠加就出现了 "能看到英文但中文全是方块" 的现象。

解决方案

方案一:设置环境变量(推荐,永久生效)

~/.bashrc 中添加:

bash 复制代码
export PYTHONIOENCODING=utf-8

对于 PowerShell 用户,在 $PROFILE 中添加:

powershell 复制代码
$env:PYTHONIOENCODING = "utf-8"

这样 Python 程序的输出编码与终端一致,中文就能正常显示。

方案二:grep 加 -a 参数(临时解决二进制识别问题)

bash 复制代码
my-python-tool --verbose | grep -a ERROR

-agrep 将输入强制当作文本处理,解决 "Binary file matches" 的问题,但不解决乱码。

方案三:关闭程序的颜色输出

bash 复制代码
# 方式一:程序自带选项
my-python-tool --verbose --no-color | grep ERROR

# 方式二:通过环境变量(部分程序支持)
NO_COLOR=1 my-python-tool --verbose | grep ERROR

关闭颜色输出后,grep 不会误判二进制,但需要程序本身支持。

方案四:重定向到文件再查看

bash 复制代码
my-python-tool --verbose > output.txt 2>&1
grep ERROR output.txt

写文件时不会经过管道编码转换,VSCode 等编辑器会自动识别 UTF-8。

最佳实践

同时设置 PYTHONIOENCODING 和使用 grep -a,一劳永逸:

bash 复制代码
# ~/.bashrc
export PYTHONIOENCODING=utf-8

# 使用时
my-python-tool --verbose | grep -a ERROR

本账号所有文章均为原创,欢迎转载,请注明文章出处:https://shandianchengzi.blog.csdn.net/article/details/162127355。百度和各类采集站皆不可信,搜索请谨慎鉴别。技术类文章一般都有时效性,本人习惯不定期对自己的博文进行修正和更新,因此请访问出处以查看本文的最新版本。