1

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

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

4

1 回答 1

2

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

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

其他的建议:

  • 如果您使用$@它值得在 ( ) 周围加上双引号"$@"。否则等于$*"$@"更安全,因为该项目可以包含空间。
  • 但是在这种情况下,for循环可以写成for i; dofor的默认参数是位置参数。
  • ` 字符也毫无意义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这并不重要。仅在脚本命令行中没有添加任何(有效)参数的情况下。
于 2013-05-28T14:12:46.913 回答