bash读取循环过早的EOF

时间:2011-09-30 18:59:01

标签: bash loops

在下面的代码中,我希望while循环执行三次,对于输入build.cfg文件中的每个匹配行执行一次。这实际上是 发生的事情,但只有当我注释掉案例块的内容时 - 即以( mkdir work ...( cd product ...开头的子shell。

如下所示执行时,循环只执行一次(对于BUILDTYPE == build

当使用-x运行时,很明显shell循环返回并执行read但得到EOF,因为没有错误并继续执行setStatus行。

显然,子shell中的某些内容正在干扰外部管道文件描述符。有人能解释为什么会发生这种情况吗?

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 个答案:

答案 0 :(得分:3)

如果子shell中的任何内容吃掉了你的输入,那么你有几个选择:

  • 检查./build内部需要输入和提供输入的内容或
  • 使用( ... ) < /dev/null
  • 剪切子壳的标准输入

答案 1 :(得分:2)

某些命令应该从 stdin 中读取。尝试使用 stdin 重定向:

在循环内运行命令
./build installer-all < /dev/null

...

./build -f ..${SVNTAG}build.xml  < /dev/null
相关问题