преждевременное чтение цикла bash EOF - PullRequest
1 голос
/ 30 сентября 2011

В следующем коде я ожидаю, что цикл while будет выполнен три раза, по одному разу для каждой совпадающей строки во входном файле build.cfg.Это на самом деле то, что происходит , но только если я закомментирую кишки блоков дела - то есть подоболочек, начинающихся с ( mkdir work ... и ( cd product ....

При выполнении, как показано ниже, цикл выполняется только один раз (для BUILDTYPE == build)

При запуске с -x ясно, что оболочка возвращается к началу и выполняет read, ноEOF, поскольку ошибок нет, и выполнение продолжается со строки setStatus.

Очевидно, что что-то в подоболочке мешает дескрипторам файлов внешнего конвейера.Может кто-нибудь объяснить, почему именно это происходит?

egrep "^\s*$BRANCH" $ETC/build.cfg | ( while read BRANCH TARGET SVNSRC SVNTAG BUILDTYPE DISTTYPE DISTARGS
do
    echo ----- $TARGET $BUILDTYPE
    pushd $WORKSPACE/$BUILDUID
    case $BUILDTYPE in
        build)
            echo ">>> BUILD"
            ( mkdir work
              cp product/buildcontrol/buildConfig_example.xml work/defaultBuildConfig.xml
              cd product
              ./build installer-all )
            ;;
        tma)
            echo ">>> TMA"
            ( cd product
              ./build -f ..${SVNTAG}build.xml )
            ;;
        *)
            ;;
    esac
    popd
done )
setStatus 3

Ответы [ 2 ]

3 голосов
/ 30 сентября 2011

Если что-то внутри подоболочки съест ваш ввод, то у вас есть несколько вариантов:

  • Проверьте, что внутри ./build хочет некоторый ввод, и подайте этот ввод или
  • стандартввод подоболочек с помощью ( ... ) < /dev/null
2 голосов
/ 30 сентября 2011

Некоторая команда должна читать из stdin . Попробуйте запустить команды внутри цикла с перенаправлением stdin :

./build installer-all < /dev/null

...

./build -f ..${SVNTAG}build.xml  < /dev/null
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...