如何使用Jenkins中的Execute Shell命令传递可能具有不同名称的文件

时间:2017-01-07 02:57:05

标签: shell jenkins ant

我有一个Jenkins工作,我希望使用shell从目录中读取文件,并在ant test步骤中传递该文件。

说我要阅读的文件是/home/xxx/y.txt。文件名始终更改,但在该目录中的任何给定点都只有一个.txt扩展名的文件。

所以,我试图在" Execute Shell"中传递该文件。将操作构建为ant -Dfile=/home/xxx/*.txt,但构建是"无法读取文件"。

3 个答案:

答案 0 :(得分:3)

由于-Dfile=/home/xxx/*.txt不是文件,因此shell不会将-Dfile=/home/xxx/y.txt扩展为-Dfile=/home/xxx/y.txt。但是,shell 展开/home/xxx/*.txt/home/xxx/y.txt。您可以使用命令替换获得所需的结果:

ant -Dfile=`echo /home/xxx/*.txt`

为了防止文件路径中的空格,你可以在反引号周围使用双引号:

ant -Dfile="`echo /home/xxx/*.txt`"

常规提示:如果您在Jenkins作业中运行的shell脚本出现问题,请尝试启用命令跟踪并查看控制台输出以帮助调试。命令跟踪可以通过以下两种方式之一启用(选择):

  • -x作为选项传递到脚本开头的shebang。例如,将#!/bin/sh替换为#!/bin/sh -x。在执行之前,所有命令都将在标准错误时输出。
  • set -x放在脚本中的某个位置。将跟踪此行之后的命令。

答案 1 :(得分:2)

考虑:

set -- /home/xxx/*.txt
{ [ "$#" -eq 1 ] && [ -e "$1" ]; } || {
  echo "ERROR: There should be exactly one file matching /home/xxx/*.txt" >&2
  exit 1
}
ant -Dfile="$1"

这有几个好处:

  • 你实际上是在检测到意外的情况,而不是在(不是,如果)发生不可能的事情时让它被忽视。
  • 一切都在一个shell中发生 - 没有子shell性能影响。
  • 你的文件名根本没有被破坏 - 所有奇怪的角落案例(即带有文字反斜杠的名称,echoallowed by POSIX to mangle)都得到完全支持。
  • 它完全符合任何POSIX shell。

还有一个警告:

  • set -- /home/xxx/*.txt会覆盖当前上下文中的"$@"参数向量。如果需要在外部脚本中将参数引用为"$1""$2"等,则可以将此代码放在函数中。

答案 2 :(得分:0)

file_name=(`/home/xxx/*.txt`)
ant -Dfile=${file_name}