在下面的代码中,我希望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
答案 0 :(得分:3)
如果子shell中的任何内容吃掉了你的输入,那么你有几个选择:
./build
内部需要输入和提供输入的内容或( ... ) < /dev/null
答案 1 :(得分:2)
某些命令应该从 stdin 中读取。尝试使用 stdin 重定向:
在循环内运行命令./build installer-all < /dev/null
...
./build -f ..${SVNTAG}build.xml < /dev/null