我有一个 Jenkins 作业,我想使用 shell 从目录中读取一个文件,并在ant test
步骤中传递该文件。
假设我要读取的文件是/home/xxx/y.txt
。文件的名称总是会更改,但在该目录中的任何给定点都只有一个扩展名.txt
文件。
因此,我正在尝试在"执行 Shell"构建操作中传递该文件作为ant -Dfile=/home/xxx/*.txt
但构建"无法读取文件"。
shell 不会-Dfile=/home/xxx/*.txt
扩展到 -Dfile=/home/xxx/y.txt
-Dfile=/home/xxx/y.txt
因为不是文件。但是,外壳将/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
放在脚本中的某个位置。将跟踪此行之后的命令。
考虑:
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 性能影响。
- 您的文件名根本没有被篡改 - 所有奇怪的角落情况(即带有文字反斜杠的名称,POSIX
echo
允许修改)都完全受支持。 - 它完全符合任何POSIX外壳。
还有一个警告:
-
set -- /home/xxx/*.txt
在当前上下文中覆盖"$@"
参数向量。如果需要在外部脚本中将参数引用为"$1"
、"$2"
等,则可以将此代码放在函数中。
file_name=(`/home/xxx/*.txt`)
ant -Dfile=${file_name}