2016-11-23 1 views
1

У меня есть требование инициировать сборку для некоторых конкретных проектов, которые разделены в текстовом файле запятой.shell script while loop trigger build

Я написал сценарий оболочки, чтобы разделить содержимое файла, извлечь папку и перейти к этой папке. После того, как навигация будет выполнена, вызовите сборку, и это должно произойти для всех путей проекта. Нижеприведенный скрипт отлично работает, если я перечисляю файлы в каталоге после навигации, но при выполнении градиентной сборки это выполняется только один раз.

Ниже мой сценарий оболочки

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 f1'. – chepner

+0

Но ни один цикл не выполняет или не печатает вторую итерацию. Это печать, если я использую ls -ltr вместо построения градиента. – jslearner07

+1

Это потому, что второй раз 'read f1' выполняется, больше нет ввода для чтения (при условии, что' gradle' прочитал все это), и поэтому цикл выходит после первой итерации. 'ls' does * not * читается со стандартного ввода. – 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" 

Я предполагаю, что вы меняете значение IFS для того, чтобы разделить линию чтения из $INPUT; в этом случае вам нужно указать read как минимум две переменные, чтобы первое поле было присвоено f1, а остальная часть строки назначена другой переменной. Использование pushd и popd вместе проще, чем вручную запись старого рабочего каталога; так как вы использовали подоболочку, вам все равно не нужно было использовать CWD, потому что эффект первого cd действовал только до тех пор, пока эта подоболочка не выйдет в любом случае.


Если по какой-либо причине, 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