一尘不染

在Java流程生成器中运行的“查找:-exec缺少参数”

jenkins

我正在尝试在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();

Web UI将显示println的结果:

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

当詹金斯日志(/var/log/jenkins/jenkins.log)记录以下错误时:

find: missing argument to `-exec'

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

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

所以processBuilder有点麻烦,并且\\;作为命令行参数传递


阅读 268

收藏
2020-07-25

共1个答案

一尘不染

该错误的问题\;在于,您正在将外壳转义/引号与exec函数的参数的普通传递混合在一起。

将放到\之前;,它会起作用。 ;需要在shell中使用,因为它用于在其中分隔命令。引用同样适用-将参数传递给-
style函数时,不需要shell风格的引用/转义,因为没有shell解释它(除非您运行):\ __{}``exec*``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
    }
}
2020-07-25