Что вы пытаетесь выполнить, это сценарий оболочки, а не команда ОС. Вам нужно вызвать оболочку (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()
Не было бы лучше использовать одинарные кавычки строки, чтобы избежать кто-то позже запутаться при добавлении $ вара и GString пытается расширить его? – John
Возможно, но тогда я буду вынужден избегать всех этих одинарных кавычек внутри команды. И если я изменю их на двойные кавычки, тогда кто-то может вставить в них '$ something', а оболочка расширит его, что также может сбить с толку. – Roman
Намного лучше пропустить команду оболочки! – John