2014-03-04 126 views
1

從一個更大的腳本的函數:bash腳本的目錄遍歷文件進入無限循環

function lipo { 
OUTDIR=$SDK_DIR/lib/$CONFIG 
mkdir -p $OUTDIR 
for LIBNAME in $SDK_DIR/lib/$CONFIG-iphoneos/lib* 
do 
    BASELIBNAME=`basename $LIBNAME` 
    OUTLIB=$OUTDIR/$BASELIBNAME 
    echo lipo $BASELIBNAME for $CONFIG 
    lipo $SDK_DIR/lib/$CONFIG-iphoneos/$BASELIBNAME $SDK_DIR/lib/$CONFIG-iphonesimulator/$BASELIBNAME -create -output $OUTLIB 
done 
} 

的目標目錄中有幾個文件,其實這裏是一個真實的例子: enter image description here

當我運行該功能,出現這種情況:

enter image description here

它只是非常快的循環永遠在第一個文件...(整個屏幕填充在1s以下)echo正在運行,但沒有別的 - 這lipo操作需要一秒左右,以便它每秒循環幾十次,它沒有運行。但沒有錯誤。

如果我手動在一個文件上運行命令,它似乎工作正常 - 或者如果我搞砸了,我會得到一個錯誤。所以兩個問題真的...

  1. 爲什麼只有echo運行?
  2. 無論命令是否成功,循環如何不斷重複永久目錄中的第一個文件?

回答

4

答案是遞歸。

您切實做好:

foo() { 
    echo something 
    foo 
} 

你可能想函數名稱更改爲別的東西。


或者,你可以說抑制外殼功能查找:中

command lipo $SDK_DIR/lib/$CONFIG-iphoneos/$BASELIBNAME $SDK_DIR/lib/$CONFIG-iphonesimulator/$BASELIBNAME -create -output $OUTLIB 

代替

lipo $SDK_DIR/lib/$CONFIG-iphoneos/$BASELIBNAME $SDK_DIR/lib/$CONFIG-iphonesimulator/$BASELIBNAME -create -output $OUTLIB 

在這種情況下,你可以保留現有的函數名的是

help command引用:

Runs COMMAND with ARGS suppressing shell function lookup, or display 
information about the specified COMMANDs. Can be used to invoke commands 
on disk when a function with the same name exists. 

1.遞歸,Ñ:見遞歸

+0

呵呵,你說的對!我一直對我的頭撞各種構建腳本兩天,並「密碼盲」!最初'lipo'命令是其他的東西,我改變了它,甚至從來沒有注意到這個問題。多麼尷尬。 –

+0

@John難怪他們爲什麼說代碼審查有助於:) – devnull

相關問題