我正在尝试在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有点麻烦,并且\\;作为命令行参数传递
\\;
该错误的问题\;在于,您正在将外壳转义/引号与exec函数的参数的普通传递混合在一起。
将放到\之前;,它会起作用。 只;需要在shell中使用,因为它用于在其中分隔命令。引用同样适用-将参数传递给- style函数时,不需要shell风格的引用/转义,因为没有shell解释它(除非您运行):\ __{}``exec*``sh -c
\
;
{}``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 } }