【问题标题】:"find: missing argument to `-exec'" running in a Java process builder在 Java 进程构建器中运行的“查找:缺少 `-exec' 的参数”
【发布时间】:2015-10-28 16:03:53
【问题描述】:

我正在尝试在 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 "{}" \;

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

find: missing argument to `-exec'

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

此外,如果我将\; 替换为+,则该命令有效!

因此,processBuilder 和 \\; 作为命令行参数传递有些可疑

【问题讨论】:

    标签: groovy jenkins find processbuilder


    【解决方案1】:

    \; 错误的问题在于您将 shell 转义/引用与 exec 函数的参数的普通传递混合在一起。

    ; 之前删除\ 即可。 ; 在 shell 中需要 \ only,因为它用于分隔那里的命令。引用{} 也是如此——当将参数传递给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
        }
    }
    

    【讨论】:

    • 最好使用List 作为命令的参数。我的意思是进行任何拆分 - 特别是如果可能传递运行时参数。但是 +1。
    • 是的,我也不喜欢拆分。它只在这里有效,因为参数中没有空格。
    【解决方案2】:

    你不能把以上所有的都换成:

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

    【讨论】:

    • 为什么要打扰 bash? ['find', '/tmp', '-name', '*.xml', '-exec', 'echo', '{}', ';'].execute().text.
    • 太棒了,谢谢!这是我想做的可以接受的替代品。您的回答也让我学习了更多 groovy 来做我真正想做的命令行:查找文件并替换为 sed,但是 groovy 提供了出色的 IO api:groovy-lang.org/groovy-dev-kit.html#_working_with_ioStill,我'想知道为什么 ProcessBuilder 没有通过\;,我想不出它失败的原因
    猜你喜欢
    • 2014-04-05
    • 2011-02-27
    • 2017-12-16
    • 2012-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-11
    相关资源
    最近更新 更多