我有一个Jenkins工作,我希望使用shell从目录中读取文件,并在ant test
步骤中传递该文件。
说我要阅读的文件是/home/xxx/y.txt
。文件名始终更改,但在该目录中的任何给定点都只有一个.txt
扩展名的文件。
所以,我试图在" Execute Shell"中传递该文件。将操作构建为ant -Dfile=/home/xxx/*.txt
,但构建是"无法读取文件"。
答案 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"
这有几个好处:
echo
是allowed by POSIX to mangle)都得到完全支持。还有一个警告:
set -- /home/xxx/*.txt
会覆盖当前上下文中的"$@"
参数向量。如果需要在外部脚本中将参数引用为"$1"
,"$2"
等,则可以将此代码放在函数中。答案 2 :(得分:0)
file_name=(`/home/xxx/*.txt`)
ant -Dfile=${file_name}