如何从GHC/Cabal/Stack获取错误与警告的准确计数?
解决Stack/GHC构建时准确统计错误与警告数量的Bash方案
GHC的错误和警告输出遵循固定格式,我们可以通过匹配该格式来避免文件名含"error"/"warning"导致的假阳性统计,以下是两种可行的Bash实现方式:
直接命令行执行
无需编写脚本,直接在终端运行以下命令即可实时统计:
stack build 2>&1 | tee build.log | awk '/^.*:[0-9]+(:[0-9]+)?: (error|warning):/ {count[$NF]++} END {print "Errors: " count["error:"]+0 ", Warnings: " count["warning:"]+0}'
参数说明:
2>&1:将Stack构建的标准错误输出重定向到标准输出,确保错误和警告信息能被后续命令捕获tee build.log:同时将构建输出保存到build.log文件,方便事后排查awk逻辑:匹配GHC标准的错误/警告行格式(文件路径:行号(:列号): error:或文件路径:行号(:列号): warning:),分别统计两类信息的数量,最后输出结果
可复用脚本
如果需要频繁使用,可以编写一个可执行脚本:
- 创建文件
count-ghc-issues.sh并写入以下内容:
#!/bin/bash # 执行Stack构建,捕获输出并统计错误/警告 stack build 2>&1 | tee build.log | awk ' /^.*:[0-9]+(:[0-9]+)?: (error|warning):/ { if ($NF == "error:") { errors++ } else if ($NF == "warning:") { warnings++ } } END { printf "Build finished: %d errors, %d warnings\n", errors+0, warnings+0 }'
- 赋予脚本执行权限:
chmod +x count-ghc-issues.sh
- 运行脚本:
./count-ghc-issues.sh
核心原理
该方案通过正则匹配GHC输出的结构化错误/警告行,只有当行内容符合[文件路径]:[行号](:[列号]): [error/warning]:的格式时才会被统计,彻底规避了文件名或代码中含"error"/"warning"字样导致的假阳性问题。
内容的提问来源于stack exchange,提问作者Peter Bergman
相关产品推荐
相关产品推荐

