Выполнение нескольких команд оболочки в одном процессе в скрипте groovy - PullRequest
0 голосов
/ 11 мая 2018

Я хочу получить пакет npm и распаковать его в groovy-скрипте, например, так:

def cmd = "cd .composerpages/umanagement && npm pack @mag-umanagement/umanagement-pages-v2810@^28.10.4-SNAPSHOT && tar xvzf *.tgz"
cmd.execute()

К сожалению, он выполняет только первый термин (cd .composerpages / umanagement).

Есть ли способ выполнить несколько команд в одном процессе оболочки?

Ответы [ 3 ]

0 голосов
/ 11 мая 2018

В этом случае вы можете попробовать токенизировать ваш конвейер команд в список команд и выполнять их последовательно, пока они возвращают код выхода 0 (&& останавливает конвейер команд, когда команда возвращает ненулевой код выхода). Рассмотрим следующий пример:

def cmd = 'echo test && echo foo && exit 1 && echo 123'

cmd.tokenize('&&').every {
  try {
    def p = it.execute()
    def output = p.text.trim()

    p.waitFor()

    println output

    return p.exitValue() == 0
  } catch (e) {
    return false
  }
}

Здесь у нас есть конвейер из 4 команд:

  • echo test
  • echo foo
  • exit 1
  • echo 123

Связывание этих команд с оператором AND (&&) предполагает останов конвейера после exit 1.

Метод Groovy Iterable.every(Closure closure) выполняется до тех пор, пока возвращаемый предикат равен true. В нашем случае мы продолжаем перебирать список команд, пока код выхода равен 0.

Выполнение приведенного выше примера приводит к выводу на консоль:

test
foo
0 голосов
/ 13 мая 2018

Если вам нужны все «оболочки», просто дайте оболочке справиться с этим (с помощью -c).Например:

def cmd = "cd .composerpages/umanagement && npm pack @mag-umanagement/umanagement-pages-v2810@^28.10.4-SNAPSHOT && tar xvzf *.tgz"
["/bin/sh", "-c", cmd].execute()
0 голосов
/ 11 мая 2018

Я думаю, что вам нужно выполнить все опции, а не && их.

Вот как вы должны подходить к этому:

def cmd = 'cd .composerpages/umanagement'.execute() | 'npm pack @mag-umanagement/umanagement-pages-v2810@^28.10.4-SNAPSHOT'.execute() | 'tar xvzf *.tgz'.execute()
cmd.waitFor()
println cmd.text
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...