Установить код возврата (выхода) в цикле find, while - PullRequest
1 голос
/ 14 марта 2012

У меня есть что-то вроде этого:

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"
                else
                    RESULT="OK"
                fi
                ...
                echo "$TEST: $RESULT\n" > /dev/stderr
                cd $RETURN_PATH
            fi
        done

Я хочу сделать тест, если в каждой папке, в которой есть cmd-заданная проверка на наличие пустых файлов x-delta.Если какой-либо из этих файлов не пуст, я хочу написать FAILED и установить код возврата равным 1. Но я хочу проверить все папки, поэтому я думаю, что я использую переменную, установите ее на 1 и в конце проверьте, равен ли он 1это выход 1 или выход 0. Но есть проблема, когда я выхожу из этого цикла, у меня нет 1 в моей переменной.Так как мне решить эту проблему?

1 Ответ

2 голосов
/ 14 марта 2012

Цикл выполняется в подпроцессе, поэтому вам придется использовать некоторую форму 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 $?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...