Groovy 执行复杂的 shell 命令

3
我希望能够在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)

请参阅Groovy文档中的进程管理 - 将语句分解为两个语句可能会提供一些线索,为什么它不能按预期工作 - 当两个部分都返回所需的结果时,仍然可以将其表述为单行语句。可以在输出捕获的文本之前使用.waitFor()等待进程终止;此外,|运算符也可用,只是不能在[]括起来的命令/参数数组内使用...因为我有印象,它很可能旨在看起来像这样:

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

我认为最简单的公式是:["mdfind", "-name ${filename}"].execute()。这与在终端中运行命令“mdfind -name 文件名”相同。

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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接