2016-06-08 3 views
1

У меня есть следующий groovy, который по некоторым причинам, кажется, не выполняется. Если я вставляю команду непосредственно на консоль, тогда эта команда работает нормально и дает результаты.groovy execute process does not work

def process = "find . -name '*.java' -o -name '*.jsff' -o -name '*.jspx' -not -path '*/noship/*' | xargs grep '${finalStr}'".execute() 
    process.text.eachLine{ 
     println it 
    } 

Что здесь не так?

ответ

1

Что вы пытаетесь выполнить, это сценарий оболочки, а не команда ОС. Вам нужно вызвать оболочку (sh -c '...') для синтаксического анализа и выполнения этой строки. Что-то вроде:

def process = ['sh', '-c', "find . -name '*.java' -o -name '*.jsff' -o -name '*.jspx' -not -path '*/noship/*' | xargs grep '${finalStr}'"].execute() 

И я советовал бы против таких GString замен (${finalStr}), так как специальные символы внутри finalStr могут разорвать эту команду оболочки. Вместо этого, я хотел бы использовать замену оболочки:

def process = ['sh', '-c', "find . -name '*.java' -o -name '*.jsff' -o -name '*.jspx' -not -path '*/noship/*' | xargs grep \"\$1\"", 'sh', finalStr].execute() 

Здесь все аргументы после команды оболочки сопоставляется оболочки позиционных параметров $0, $1, $2 и т.д., поэтому finalStr становится $1.


Но правильно ™ сделать это не использовать оболочку на всех - find есть все силы, чтобы сделать то, что вам нужно. Но мы должны разбить команду на отдельные части, чтобы выполнить его:

def process = ['find', '.', 
     '(', 
     '-name', '*.java', 
     '-o', '-name', '*.jsff', 
     '-o', '-name', '*.jspx', 
     '-not', '-path', '*/noship/*', 
     ')', 
     '-exec', 'grep', '--', finalStr, '{}', '+' 
    ].execute() 
+0

Не было бы лучше использовать одинарные кавычки строки, чтобы избежать кто-то позже запутаться при добавлении $ вара и GString пытается расширить его? – John

+0

Возможно, но тогда я буду вынужден избегать всех этих одинарных кавычек внутри команды. И если я изменю их на двойные кавычки, тогда кто-то может вставить в них '$ something', а оболочка расширит его, что также может сбить с толку. – Roman

+0

Намного лучше пропустить команду оболочки! – John