2016-11-23 2 views
1

私は、コンマでテキストファイルに区切られた特定のプロジェクトのビルドをトリガする必要があります。シェルスクリプトwhileループトリガービルド

ファイルの内容を分割してフォルダを抽出し、そのフォルダに移動するシェルスクリプトを作成しました。ナビゲーションが完了したら、ビルドをトリガします。これはすべてのプロジェクトパスで発生するはずです。ナビゲーション後にディレクトリにファイルをリストすると、下のスクリプトはうまく動作しますが、グラデルビルドを実行している間は、これは一度だけ実行されます。以下は

は、このスクリプトと私のシェルスクリプト

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'ん。(あなたは絶対にread$INPUTから読み取ることになっていることをを知っているので、全くgradleに干渉する理由はありませんあなたはとにかくこれを検討をしているかもしれませんか。)?もしそうなら、次の 'read f1'が実行される前に残りの入力ファイルを消費しているかもしれません。 – chepner

+0

しかし、どちらのループも実行されていないか、2回目の繰り返しを印刷していません。それは、私がls -ltrをgradle buildの代わりに使うと印刷されます。 – jslearner07

+1

これは、2回目の 'read 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の値を変更していると仮定。その場合、最初のフィールドがf1に割り当てられ、残りの行が別の変数に割り当てられるように、少なくとも2つの変数をreadに与える必要があります。 pushdpopdを一緒に使用すると、古い作業ディレクトリを手動で記録するより簡単です。サブシェルを使用していたので、CWDを使用する必要はありませんでした。なぜなら、最初のcdの効果は、そのサブシェルが終了するまでのみであったからです。


あれば、どのような理由、gradleため$INPUTから読み取るために、異なるファイルディスクリプタを使用し、標準入力にアクセスする必要がありません。

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

ありがとうございます。それが問題を解決しました。あなたが説明したことは正しいです。標準入力にアクセスする必要はありません。 2番目の変数も必要です – jslearner07