我正在使用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
我无法弄清楚执行顺序为何会发生变化。有什么想法吗?
答案 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上工作。