Groovy执行复杂的shell命令

Groovy执行复杂的shell命令,groovy,Groovy,我想在Groovy脚本中执行一个shell命令,其中脚本的一部分是可能包含空格的文件名变量 据我所知,我可以为此使用数组: def filename = '/tmp/folder with spaces' // does not work 'ls "' + filename + '"'.execute() // works ['ls', filename].execute() 但我不知道如何使用数组重新格式化以下命令,其中“filename”是一个groovy变量,包含带空格或不带空格的文

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

据我所知,我可以为此使用数组:

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()

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

println([
    "mdfind",
    "/usr/libexec/PlistBuddy",
    "-c 'Print RawQuery'",
    "${filename}"
].execute().text)
请参阅关于的Groovy文档-将语句分解为两个语句可能会提供一些线索,说明为什么它不能按预期工作-但在两个部分都返回所需结果后,仍然可以将其表述为单行语句。在输出捕获的文本之前,还可以
.waitFor()
处理终止;另外,
|
操作符在那里可用,只是不在带括号的命令/参数数组中。。。因为我的印象是,它很可能是这样的:

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

我会考虑最简单的公式:<代码> [“MdSube”,“-No.${FrimeNe}”]。ExcUnter()/Case>

< P>我总是使用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)