我想在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()
答案 0 :(得分: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()
答案 1 :(得分: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)