我编写了一个脚本,它将项目名称作为参数,并通过遍历参数在它们上运行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."
这里的问题是脚本在实际构建过程开始之前退出,并且尽管我对输出进行了重定向,但构建过程的输出仍在终端本身上显示。请告诉我这里我做错了什么。
答案 0 :(得分:1)
我认为您的bash
无法识别&>>
重定向,因此您似乎在后台启动了这些流程,因此它快速退出并不是一个奇迹。如果您想在后台运行,请在wait
行之后加done
,脚本将等到最后一个后台进程完成。
如果您要将stdout
和stderr
重定向到文件,请使用someprocess args >>logfile 2>&1
。
其他评论:
"$@"
更安全,因为该项可以包含空格。for i; do
,因为for的默认args是位置参数。 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
并不重要。仅在没有任何(有效)参数添加到脚本命令行的情况下。