Groovy выполнить сложную команду оболочки - PullRequest
0 голосов
/ 31 мая 2018

Я хотел бы выполнить команду оболочки в скрипте Groovy, где часть скрипта является переменной имени файла, которое может содержать пробелы.

Согласно выполнение groovy с параметрами, содержащими пробелы Я могу использовать для этого массив:

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 голосов
/ 31 мая 2018

Я всегда запускаю сложные команды оболочки, используя split ().

Пример:

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)
0 голосов
/ 31 мая 2018

, если только вы не знаете, каким может быть необработанный вывод /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()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...