bash从jenkins运行时更改命令的执行顺序

时间:2013-06-14 21:58:20

标签: bash shell

我正在使用git log更新我的项目的release_notes。当我在我的mac笔记本电脑上运行下面的脚本时,一切都按预期工作,当我在运行centos的jenkins上运行时,我看到以下作为执行顺序:

脚本

...
FILE=RELEASE_NOTES
TMP_FILE=${FILE}.tmp
VERSION=$(cat pom.xml | grep "<version>" | head -n1 | sed -e "s/.*\>\(.*\)\<.*/\1/" | tr -d "\-SNAPSHOT")
NAME=$(cat pom.xml | grep "<artifactId>" | head -n1 | sed -e "s/.*\>\(.*\)\<.*/\1/")

echo "$NAME-${VERSION}" > ${TMP_FILE}
git log --pretty="%x09* [%h] %s." $(git describe --abbrev=0)..HEAD >> ${TMP_FILE}

echo "" >> ${TMP_FILE}

if [ -e $FILE ]; then
  cat ${FILE} >> ${TMP_FILE}
fi

mv ${TMP_FILE} $FILE
...
使用#!/ bin / bash -x

运行时输出jenkins
+ FILE=RELEASE_NOTES
+ TMP_FILE=RELEASE_NOTES.tmp
++ tr -d '\-SNAPSHOT'
++ head -n1
++ cat pom.xml
++ sed -e 's/.*\>\(.*\)\<.*/\1/'
++ grep '<version>'
+ VERSION='</'
++ head -n1
++ sed -e 's/.*\>\(.*\)\<.*/\1/'
++ cat pom.xml
++ grep '<artifactId>'
+ NAME='</'
+ echo '</-</'
++ git describe --abbrev=0

我无法弄清楚执行顺序为何会发生变化。有什么想法吗?

3 个答案:

答案 0 :(得分:3)

我没有看到任何不一致。你有几个命令在子shell中运行 (当它设置VERSION和NAME时),这些命令必须在之前执行 变量被赋值给,所以上面的/ bin / bash -x输出是我期望看到的。

如果您正在讨论每个管道中命令的顺序, 请记住,它们都是同时运行的,以及确切的启动顺序 might not be specified

答案 1 :(得分:1)

管道中各个命令的启动顺序(set -x向您显示的内容)无关紧要。数据仍然从左向右流动。但是,您可以使用对grep的单个调用而不是管道来设置变量。 (这确实假设GNU grep。)

VERSION=$( grep -oP -m 1 '(?<=<version>).*(?=-SNAPSHOT)' pom.xml )
NAME=$( grep -oP -m 1 '(?<=<artifactId>).*(<=</artifactId)' pom.xml )

答案 2 :(得分:0)

所以在mac grep上是BSD,linux GNU,所以管道似乎是确保它适用于每个环境的最佳选择。但找到了另一个解决方案:maven。

VERSION = $(mvn org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate -Dexpression = project.version | egrep -v“(^ [INFO] |下载)”| tr - d“-SNAPSHOT”)       NAME = $(mvn org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate -Dexpression = project.artifactId | egrep -v“(^ [INFO] |下载)”)

这将让我获得版本/名称,并在mac和linux上工作。