Цикл выполняется в подпроцессе, поэтому вам придется использовать некоторую форму IPC для связи с исходным процессом (оболочкой).
Возможно, самое простое решение - просто вывести ваше сообщение об ошибке в стандартный выводи добавьте канал после цикла while для анализа выходных данных.Достаточно простого grep.Просто убедитесь, что никакая другая команда не может записать 'FAILED' в стандартный вывод.
find $1 | grep -E $2 | while read prom; do
if [[ $prom =~ (cmd-given) ]];
then
...
RETURN_PATH=$PWD
cd $WORKING_PATH
...
if [[ -s "stdout-delta" ]] || [[ -s "stderr-delta" ]] || [[ -s "status-delta" ]];
then
RET_ERROR=1
RESULT="FAILED"
echo $RESULT
else
RESULT="OK"
fi
...
echo "$TEST: $RESULT\n" > /dev/stderr
cd $RETURN_PATH
fi
done | grep -q FAILED
[ "$?" == 0 ] && exit 1
Редактировать: временное решение на основе файлов:
TMPFILE=$0.tmp
trap "rm -f $TMPFILE; exit 1" 0 1 2 3 13 15
find $1 | grep -E $2 | while read prom; do
if [[ $prom =~ (cmd-given) ]];
then
...
RETURN_PATH=$PWD
cd $WORKING_PATH
...
if [[ -s "stdout-delta" ]] || [[ -s "stderr-delta" ]] || [[ -s "status-delta" ]];
then
RET_ERROR=1
RESULT="FAILED"
echo $RESULT >> $TMPFILE
else
RESULT="OK"
fi
...
echo "$TEST: $RESULT\n" > /dev/stderr
cd $RETURN_PATH
fi
done
grep -q FAILED $TMPFILE && rm $TMPFILE && exit 1
rm $TMPFILE && exit 0
Редактировать 2: решение на основе функций
process () {
find $1 | grep -E $2 | (cat; echo EXIT_MARKER) | while read prom; do
[[ $prom == "EXIT_MARKER" ]] && exit $EXIT_STATUS
if [[ $prom =~ (cmd-given) ]];
then
...
RETURN_PATH=$PWD
cd $WORKING_PATH
...
if [[ -s "stdout-delta" ]] || [[ -s "stderr-delta" ]] || [[ -s "status-delta" ]];
then
RET_ERROR=1
RESULT="FAILED"
EXIT_STATUS=1
else
RESULT="OK"
fi
...
echo "$TEST: $RESULT\n" > /dev/stderr
cd $RETURN_PATH
fi
done
exit 0
}
process $1 $2
exit $?