在shell脚本中运行maven构建以进行循环

时间:2013-05-28 12:54:29

标签: bash shell for-loop maven-2

我编写了一个脚本,它将项目名称作为参数,并通过遍历参数在它们上运行maven构建。

#!/bin/bash -xv

name=`date +%Y:%m:%d-%T`
start_time=`date +%s`
filename="log-"$name
un=`whoami`
cd "/home/"$un"/projects/buildlogs/"

`touch $filename`

filepath="/home/"$un"/projects/buildlogs/"$filename

echo "Logging to "$filepath"."
echo $@
for var in $@
    do
        path="/home/"$un"/projects/"$var
        echo $path
        cd $path
        pwd
        echo "Building "$var"."
        mvn clean install -Dmaven.test.skip=true -o &>> $filepath
        mvn eclipse:clean eclipse:eclipse -o &>> $filepath
    done

end_time=date +%s
echo "Build Successful!"
echo "Execution Time: "$(($(($end_time-$start_time))/60))" mins."

这里的问题是脚本在实际构建过程开始之前退出,并且尽管我对输出进行了重定向,但构建过程的输出仍在终端本身上显示。请告诉我这里我做错了什么。

1 个答案:

答案 0 :(得分:1)

我认为您的bash无法识别&>>重定向,因此您似乎在后台启动了这些流程,因此它快速退出并不是一个奇迹。如果您想在后台运行,请在wait行之后加done,脚本将等到最后一个后台进程完成。

如果您要将stdoutstderr重定向到文件,请使用someprocess args >>logfile 2>&1

其他评论:

  • 如果你使用$ @值得加上双引号(“$ @”)。否则它等于$ *。 "$@"更安全,因为该项可以包含空格。
  • 但在这种情况下,for循环可以写为for i; do,因为for的默认args是位置参数。
  • 此外,'字符在触摸$ filename周围没有意义。
  • cd "/home/"$un"/projects/buildlogs/"可以写成cd ~/projects/buildlogs/。类似地可以应用于所有/home/$un字符串。
  • 可以将变量扩展放在双引号内。例如。 echo "AAA $x BBB"
  • 最后一行可以写得更简单echo "Execution Time: $(((end_time-start_time)/60)) mins."
  • 文件名可以一步完成:filename=log-$(date +%Y:%m:%d-%T)
  • 实际上你不需要去~/projects/buildlogs/目录。您可以改用touch $filepath。但正如我所见,touch并不重要。仅在没有任何(有效)参数添加到脚本命令行的情况下。