2011-09-30 34 views
1

在下面的代码我期望while循环来为输入build.cfg文件中的每个匹配线执行三次,一次。这实际上是在什么发生,但只有当我注释掉的情况下块的胆量 - 即开始(mkdir work ...(cd product ...的子shell。bash的读循环过早EOF

当如下图所示执行,循环只执行一次(BUILDTYPE == build

当与-x运行,很明显的是,外壳环回和执行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

一些命令应该从标准输入阅读。试着用标准输入重定向运行循环内的命令:

./build installer-all < /dev/null 

... 

./build -f ..${SVNTAG}build.xml < /dev/null 
+0

由于

  • 切子shell的标准输入的。你和AH都有答案,你是第一个几分钟,所以你得到了“接受”。 –

  • 3

    如果子shell里的任何东西吃你的输入,那么你有几种选择:

    • 检查里面有什么./build想一些输入和电源该输入或通过使用(...) < /dev/null
    +0

    有趣......我知道'/ build'不读任何输入。然而,由于我没有写它,它在幕后调用ANT,我不能肯定它不会做内部的文件描述符的东西。我会尝试你的建议。 –