【问题标题】:Running a maven build inside a shell script for loop在循环的 shell 脚本中运行 maven 构建
【发布时间】:2013-05-23 11:01:27
【问题描述】:

我编写了一个脚本,它将项目名称作为参数,并通过迭代参数在它们上运行 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."

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

【问题讨论】:

  • 第一期:touch $filename不需要在`s里面;第二:你可以写"$HOME"而不是/home/$un
  • 感谢您的建议,但这些部分工作正常......它的构建命令给我带来了麻烦......!

标签: bash shell for-loop maven-2


【解决方案1】:

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

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

其他cmets:

  • 如果您使用$@,则值得将双引号括起来("$@")。否则等于$*"$@" 更安全,因为它可以包含空格。
  • 但在这种情况下,for 循环可以写成for i; do,因为 for 的默认参数是位置参数。
  • 此外,` 字符在 touch $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)。甚至更好:printf -v filename "log-%(Y:%m:%d-%T)T" -1。这并不意味着调用外部date(1) 实用程序。
  • 其实你不需要去~/projects/buildlogs/目录。您可以改用touch $filepath。但正如我所见,touch 并不重要。仅在脚本命令行中未添加任何(有效)参数的情况下。

【讨论】:

  • @Tejask06:我添加了更多可能的简化 cmets。
猜你喜欢
  • 2017-08-25
  • 1970-01-01
  • 2014-11-03
  • 2016-02-04
  • 1970-01-01
  • 1970-01-01
  • 2019-04-09
  • 2015-10-15
  • 2017-11-13
相关资源
最近更新 更多