Windows下Bash编写Git钩子时grep结果赋值变量仅保留最后一行
问题成因
- 回车符导致的行覆盖:pytest在非交互式运行环境(Git钩子执行时属于无TTY的非交互场景)下,为了实现动态进度刷新效果,会在每一行进度输出的末尾添加回车符
\r(而非仅用换行符\n),作用是让光标回到当前行首,后续输出直接覆盖当前行内容。这些回车符会被完整保存到test_summary变量中,当你打印变量时,所有行都会从行首开始覆盖,最终视觉上只剩最后一行,前面行未被完全覆盖的末尾内容就会表现为乱码,你遇到的3%]就是第一行进度的残留内容。 - 变量引用未加双引号:Bash中直接执行
echo $test_summary时,Shell会自动拆分变量中的所有空白字符(包括换行、制表符),将换行替换为空格,也会导致原本的多行内容合并为单行展示。
解决方案
- 首先在管道中过滤掉所有回车符,避免行覆盖问题:
test_summary=$(pytest -v | tr -d '\r' | grep -E ".+\.py::.+[A-Z]+")
tr -d '\r'命令会删除输出流中所有的回车符,仅保留标准换行符。
2. 打印变量时必须添加双引号,保留原始换行格式:
echo "$test_summary"
- (可选)如果仍存在输出异常,可以强制pytest禁用动态进度输出,添加参数调整输出格式:
test_summary=$(pytest -v --no-progress | tr -d '\r' | grep -E ".+\.py::.+[A-Z]+")
内容的提问来源于stack exchange,提问作者user32882
相关产品推荐
相关产品推荐

