groovy执行过程不起作用

时间:2016-06-08 00:16:36

标签: shell groovy execute

我有以下groovy,由于某些原因似乎没有执行。如果我直接在控制台上粘贴命令,那么该命令运行正常并给出结果。

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

这里有什么问题?

1 个答案:

答案 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()