我有以下groovy,由于某些原因似乎没有执行。如果我直接在控制台上粘贴命令,那么该命令运行正常并给出结果。
def process = "find . -name '*.java' -o -name '*.jsff' -o -name '*.jspx' -not -path '*/noship/*' | xargs grep '${finalStr}'".execute()
process.text.eachLine{
println it
}
这里有什么问题?
答案 0 :(得分:1)
您尝试执行的是shell脚本,而不是OS命令。您需要调用shell(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
内的特殊符号可以破坏该shell命令。相反,我使用shell替换:
def process = ['sh', '-c', "find . -name '*.java' -o -name '*.jsff' -o -name '*.jspx' -not -path '*/noship/*' | xargs grep \"\$1\"", 'sh', finalStr].execute()
这里shell命令之后的所有参数都映射到shell位置参数$0
,$1
,$2
等,因此finalStr
变为$1
。
但正确的做法是不要使用外壳 - find
具备完成所需功能的所有功能。但我们必须将命令分解为单个部分才能执行它:
def process = ['find', '.',
'(',
'-name', '*.java',
'-o', '-name', '*.jsff',
'-o', '-name', '*.jspx',
'-not', '-path', '*/noship/*',
')',
'-exec', 'grep', '--', finalStr, '{}', '+'
].execute()