sh -c: ошибка незавершенной строки в кавычках в заводном вызове

Я исследовал проблему и думаю, что проблема в том, что я вызываю bash из переменной.

На Stackexchange есть несколько отличных ресурсов, включая очень похожие вопросы.

Наиболее близким совпадением будет этот вопрос.

Существует FAQ, который пытается помочь.

Я пытаюсь вызвать команду оболочки из скрипта groovy.

Вот рабочий минимальный пример:

def working()
{
    printf "start\n"
    def cmd = "sh -c 'ls'"
    def proc = cmd.execute()
    proc.waitFor()  
    if (proc.exitValue() > 1) 
    {
        printf cmd + "\nexitcode:" + proc.exitValue().toString() + "\n"
        println "[ERROR] ${proc.getErrorStream()}"
    }   
    printf "end\n"
}

Вот код, который вызывает у меня головную боль

def notworking()
{
    printf "start\n"
    def cmd = "sh -c 'command -v ls'"
    def proc = cmd.execute()
    proc.waitFor()  
    if (proc.exitValue() > 1) 
    {
        printf cmd + "\nexitcode:" + proc.exitValue().toString() + "\n"
        println "[ERROR] ${proc.getErrorStream()}"
    }   
    printf "end\n"
}

Мне нужно использовать sh, чтобы вызвать command.

Мой вывод ошибки:

sh -c 'command -v ls'
exitcode:2
[ERROR] -v: 1: -v: Syntax error: Unterminated quoted string

Я почти уверен, что это связано с тем, как аргументы на самом деле разделены. Я не могу применить ни один из советов по массиву из других вопросов/ответов.

Проделав должную осмотрительность в исследовании этого, я уверен, что это не дубликат. Это также актуально в широком смысле, поскольку может быть полезно всем, кто использует jenkins и разрабатывает groovy-скрипты.


person Johannes    schedule 01.08.2019    source источник
comment
Является ли команда фактическим двоичным файлом или это какой-то скрипт?   -  person Ulises André Fierro    schedule 01.08.2019
comment
@UlisesAndréFierro command — это одна из встроенных команд, поэтому мне нужно выполнить sh, чтобы она правильно интерпретировалась.   -  person Johannes    schedule 01.08.2019
comment
@cfrick да, определенно дубликат   -  person Johannes    schedule 02.08.2019


Ответы (1)


Мне удалось обойти разделение, используя переменную окружения и другую функцию выполнения.

def cmd = "sh -c \$args"
def proc = cmd.execute(["args=command -v $command_name"], null)
proc.waitFor()

Я нашел документацию по синтаксису здесь.

public Process execute(List envp, File dir)

Пользователь cfrick указывает, что есть лучшее решение здесь< /а>.

person Johannes    schedule 01.08.2019