2011-09-30 36 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,我不能肯定它不會做內部的文件描述符的東西。我會嘗試你的建議。 –