我需要为某些特定项目触发构建,这些项目使用逗号分隔在文本文件中。
我写了一个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
此脚本有任何问题吗?请帮忙
答案 0 :(得分: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
比手动记录旧的工作目录更简单;因为你使用的是子shell,所以你无需使用CWD
,因为第一个cd
的效果只有在子shell退出之前才有效。
如果由于某种原因,gradle
需要访问标准输入,请使用不同的文件描述符从$INPUT
读取。 (你可能会考虑这样做;你绝对知道<{em>} read
应该从$INPUT
读取,所以没有理由干涉gradle
。 )
while IFS=, read -r f1 rest <&3; do
echo "$f1 building..."
pushd "$f1"
gradle clean b u
popd
done 3< "$INPUT"