首页 文章

Groovy执行复杂的shell命令

提问于
浏览
2

我想在Groovy脚本中执行一个shell命令,其中脚本的一部分是可能包含空格的文件名的变量 .

根据groovy execute with parameters containing spaces我可以使用一个数组:

def filename = '/tmp/folder with spaces'

// does not work
'ls "' + filename + '"'.execute()

// works
['ls', filename].execute()

但我无法弄清楚如何使用数组重新格式化以下命令,其中“filename”是包含带或不带空格的文件名的groovy变量:

mdfind "$(/usr/libexec/PlistBuddy -c 'Print RawQuery' filename)"

这不起作用:

// not working
["mdfind", "\$(/usr/libexec/PlistBuddy -c 'Print RawQuery' " + filename + ")"].execute()
["mdfind", "\$(/usr/libexec/PlistBuddy -c 'Print RawQuery' ", filename, ")"].execute()

2 回答

  • 0

    除非知道 /usr/libexec/PlistBuddy 的原始输出可能是什么,否则很难说必须如何放置括号以提供语法意义 .

    println([
        "mdfind",
        "/usr/libexec/PlistBuddy",
        "-c 'Print RawQuery'",
        "${filename}"
    ].execute().text)
    

    请参阅Process Management上的Groovy文档 - 将语句分解为两个语句可能会提供一些线索,为什么它不能按预期工作 - 而一旦两个部分都返回所需的结果,仍然可以将其公式化为单行语句 . 在输出捕获的文本之前,还可以 .waitFor() 进程终止;还有 | 运算符在那里,只是不在 [] 括号内的命令/参数数组中...因为我有这样的印象,它很可能是这样的:

    def p = "mdfind".execute() | [
        "/usr/libexec/PlistBuddy",
        "-c 'Print RawQuery'",
        "${filename}"
    ].execute()
    p.waitFor()
    println p.text
    

    我会考虑最简单的表述: ["mdfind", "-name ${filename}"].execute()

  • 0

    我总是使用split()运行复杂的shell命令 .

    例:

    def sout = new StringBuilder(), serr = new StringBuilder()
    def shellCommand="" //your shell command here
    Process proc = shellCommand.split().execute()
    proc.consumeProcessOutput(sout, serr)
    proc.waitForOrKill(100000L)
    

相关问题