通过一些谷歌搜索(无论如何我都不是 bash 专家),我能够编写一个 bash 脚本,它允许我运行一个测试套件并在它运行时在底部输出一个状态栏。通常需要大约 10 个小时,状态栏会告诉我有多少测试通过,多少失败。
有时它工作得很好,但偶尔我会遇到一个无限循环,这很糟糕(mmm-kay?)。这是我正在使用的代码:
#!/bin/bash
WHITE="\033[0m"
GREEN="\033[32m"
RED="\033[31m"
(run_test_suite 2>&1) | tee out.txt |
while IFS=read -r line;
do
printf "%$(tput cols)s\r" " ";
printf "%s\n" "$line";
printf "${WHITE}Passing Tests: ${GREEN}$(grep -c passed out.txt)\t" 2>&1;
printf "${WHITE}Failed Tests: ${RED}$( grep -c FAILED out.txt)${WHITE}\r" 2>&1;
done
当我遇到这个错误时会发生什么,我将有一个错误消息无限重复,导致日志文件 ( out.txt
) 变成一些数兆字节的怪物(我认为它进入了 GB 一次)。这是一个重复的示例错误(每组之间有四行空白):
warning caused by MY::Custom::Perl::Module::TEST_FUNCTION
print() on closed filehandle GEN3663 at /some/CPAN/Perl/Module.pm line 123.
我尝试取消2>&1
重定向,并尝试更改while IFS=read -r line;
为while read -r line;
,但我不断进入无限循环。奇怪的是,这似乎在大多数情况下都会发生,但有时我完成了长长的测试套件而没有任何问题。
编辑:
我写这篇文章的原因是从黑白测试套件升级到彩色测试套件(因此是 ANSI 代码)。以前,我会使用
run_test_suite > out.txt 2>&1 &
watch 'grep -c FAILED out.txt; grep -c passed out.txt; tail -20 out.txt'
以这种方式运行它会从 Perl 获得相同的警告,但会将其打印到文件中并继续前进,而不是陷入无限循环。使用 watch,也会打印类似的东西,[32m
而不是实际将文本渲染为绿色。