Groovy:如何在Groovy中执行复杂的Shell命令?

3

我希望能执行嵌套的shell命令。例如:

final String cmd = 'for i in pom.xml projects.xml; do find . -name $i | while read fname; do echo $fname; done;done'

我尝试了以下语法,但无法成功运行:
  1. def result = cmd.execute();
  2. def result = ['sh', '-c', cmd].execute();
  3. def result = ('sh -c for i in pom.xml projects.xml; do find . -name $i | while read fname; do echo $fname; done;done').execute()
我需要帮助。

2
为什么不编写一个Shell脚本并执行它,或者编写一些Groovy代码来执行相同的功能呢? - tim_yates
如果我可以在Groovy中执行,那将会更容易。虽然我可以在Groovy中完成这个任务,但以上只是一个例子,我可能会有更复杂的命令;有些东西在Groovy中实现会需要更长的时间。如果没有简单的方法在Groovy中调用shell命令,那么我就必须创建一个单独的shell脚本,但是现在我又要跟踪另一个脚本文件了。 - blkberry2001
据推测,这个操作失败了但未给出任何提示? - Brian Henry
2个回答

7
这应该可以工作:
def cmd = [
  'bash',
  '-c',
  '''for i in pom.xml projects.xml
    |do
    |  find . -name $i | while read fname
    |  do
    |    echo $fname
    |  done
    |done'''.stripMargin() ]

println cmd.execute().text

我相信你的命令可以被替换为以下内容:

(我已经将命令文本格式化,使其在这里看起来更好,你可以将所有内容放在一行中)

find . -name pom.xml -o -name projects.xml -print

或者,用Groovy编写:
def files = []
new File( '.' ).traverse() { 
  if( it.name in [ 'pom.xml', 'projects.xml' ] ) {
    files << it
  }
}

println files

3

感谢所有的帮助。这是一个很棒的社区。在传递环境和工作目录信息后,我已经成功让它运行了。

def wdir = new File( "./", module ).getAbsoluteFile() ;
def env = System.getenv();
def envlist = [];
env.each() { k,v -> envlist.push( "$k=$v" ) }
final String cmd = 'for i in pom.xml projects.xml; do find . -name $i | while read fname; do echo $fname; done;done'
proc = ["bash", "-c", cmd].execute(envlist , wdir);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接