От какого-то Googling (я не эксперт по bash каким-либо образом), я смог собрать сценарий bash, который позволяет мне запускать тестовый набор и выводить строку состояния внизу, пока она работает. Обычно это занимает около 10 часов, а строка состояния сообщает мне, сколько тестов прошло и сколько провалилось.Как этот сценарий bash приводит к бесконечному циклу?
Он отлично работает иногда, однако иногда я сталкиваюсь с бесконечным циклом, который является плохим (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
), чтобы стать некоторые мульти-мегабайтный уродство (я думаю, он попал в ГБ один раз). Вот пример ошибки, которая повторяется (с четырьмя линиями пробелов между каждым набором):
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;
, но я получаю бесконечное петля. Что странно, похоже, это происходит большую часть времени, но были случаи, когда я заканчивал длинный набор тестов без каких-либо проблем.
EDIT:
Причина Я пишу это, чтобы обновить из черного & белого тестового набора для цветной кодировкой набора тестов (следовательно, коды ANSI). Раньше я бы запустить тестирование с использованием
run_test_suite > out.txt 2>&1 &
watch 'grep -c FAILED out.txt; grep -c passed out.txt; tail -20 out.txt'
Забегая таким образом получает такое же предупреждение от Perl, но выводит его в файл и движется дальше, а не застрять в бесконечном цикле. Используя часы, также печатает материал, например, [32m
, вместо того, чтобы нарисовать текст как зеленый.
Что ручка печатается на ? – ikegami
И по какой причине вы должны верить, что в 'tee' есть ошибка? Какой у вас показатель, что проблема не в наборе тестов? – tripleee
вы в настоящее время присваиваете значение 'read' IFS и пытаетесь запустить команду с именем' -r' с аргументом строки. Также расширение значений (особенно командного вывода) в первый аргумент 'printf' не является хорошей идеей. У вас наверняка есть ошибка в 'run_test_suite', это не связано с' tee'. – ormaaj