2016-11-23 28 views
1

我有一個需求來觸發某些特定項目的構建,這些項目是用逗號分隔的文本文件。shell腳本while循環觸發器構建

我寫了一個shell腳本來拆分文件的內容,提取文件夾並導航到該文件夾​​。一旦導航完成,觸發構建,這應該發生在所有項目路徑上。下面的腳本工作正常,如果我在導航後列出目錄中的文件,但在執行gradle構建時,它只執行一次。

下面是我的shell腳本

CWD="$(pwd)" 
INPUT=deploy.txt 
OLDIFS=$IFS 
IFS="," 
[ ! -f $INPUT ] && { echo "$INPUT file not found"; exit 99; } 
while read f1 
do 
    echo "$f1 building..."; 
    (
    cd $f1; 
    gradle clean b u; 
    cd $CWD; 

    ) 
    echo "Build over" 

done < $INPUT 
IFS=$OLDIFS 

這個腳本的任何問題?請幫助

+1

是否'gradle'從標準輸入讀取?如果是這樣,它可能會在下一次執行「讀取f1」之前佔用輸入文件的其餘部分。 – chepner

+0

但是循環都不執行或打印第二次迭代。這是打印,如果我做ls -ltr而不是gradle build。 – jslearner07

+1

這是因爲第二次讀取f1執行,沒有更多的輸入來讀取(假設'gradle'已經讀取了所有的),所以循環在第一次迭代之後退出。 'ls'不會*從標準輸入中讀取。 – chepner

回答

4

這是推測性的(重定向gradle命令的標準輸入),但我想借此機會解決您的腳本中的其他問題。

INPUT=deploy.txt 
# Consider exiting with status 1 instead of 99 unless you have 
# a specific reason for using 99. 
[ ! -f "$INPUT" ] && { echo "$INPUT file not found"; exit 99; } 
while IFS=, read -r f1 rest 
do 
    echo "$f1 building..." 
    pushd "$f1" 
    gradle clean b u < /dev/null 
    popd 

    echo "Build over" 

done < "$INPUT" 

我假設你是爲了分割從$INPUT讀取的行改變IFS價值;在這種情況下,您至少需要給兩個變量read,以便將第一個字段分配給f1,並將該行的其餘部分分配給另一個變量。一起使用pushdpopd比手動記錄舊的工作目錄更簡單;由於您使用的是子shell,因此無論如何您都不需要使用CWD,因爲第一個cd的效果僅在該子shell退出前才生效。


如果,無論出於何種原因,gradle需要訪問標準輸入,使用不同的文件描述符$INPUT閱讀。 (你可以考慮反正這樣做,你絕對知道read應該從$INPUT閱讀,因此沒有理由用gradle干擾的。)

while IFS=, read -r f1 rest <&3; do 
    echo "$f1 building..." 
    pushd "$f1" 
    gradle clean b u 
    popd 
done 3< "$INPUT" 
+0

謝謝。這解決了這個問題。你解釋的是正確的。 gradle不需要訪問標準輸入。還需要第二個變量 – jslearner07