"发现:缺少`-exec'"在Java进程构建器

时间:2015-10-28 16:03:54

标签: groovy jenkins find processbuilder

我正在尝试在Jenkins(https://jenkins-ci.org)脚本控制台中运行find命令,该控制台允许从Web界面运行groovy脚本。

我的代码是:

ProcessBuilder pb = new ProcessBuilder();
pb.directory(new File("/var/lib/jenkins/jobs/myJob");
pb.redirectOutput(ProcessBuilder.Redirect.INHERIT);
pb.redirectError(ProcessBuilder.Redirect.INHERIT);
command = 'find . -name build.xml -exec echo \"{}\" \\;'
println(command)
pb.command(command.split(" "));
pb.start().waitFor();

网页用户界面将显示println的结果:

find . -name build.xml -exec echo "{}" \;

jenkins日志(/var/log/jenkins/jenkins.log)记录以下错误:

find: missing argument to `-exec'

但是,如果我通过shell运行在Web UI(find . -name build.xml -exec echo "{}" \;)中输出的相同命令,则不会出现此类错误。

此外,如果我替换\; witih +,该命令仍有效!

因此,使用processBuilder并且\\;作为命令行参数传递时有些可疑

2 个答案:

答案 0 :(得分:6)

\;错误的问题在于你将shell转义/引用与exec函数的params的简单传递混合在一起。

\放在;之前,它可以正常工作。 ;在shell中仅需要\ ,因为它用于在那里分离命令。同样引用{} - 当将params传递给exec* - 样式函数时,不需要shell样式的引用/转义,因为没有shell解释它(除非你运行sh -c ):

def command = 'find . -name build.xml -exec echo {} ;' // XXX
new ProcessBuilder()
    .directory(new File("/tmp"))
    .inheritIO()
    .command(command.split(" ")) // everything is just a list of strings
    .start()

这在groovy中基本相同:

("/tmp" as File).eachFileRecurse{
    if (it.name=="build.xml") {
        println it
    }
}

答案 1 :(得分:1)

无法用以下内容替换以上所有内容:

String output = ['bash', '-c', 'find . -name "*.xml" -exec echo "{}" \\;']
    .execute(null, new File('/tmp')).text