Groovy进程执行

时间:2012-10-18 16:07:12

标签: groovy

以下命令在终端上使用时工作正常

//终端

mysql -h localhost -u root my_database -e "select count(*) from page;"

但是当在groovy脚本中使用时(通过groovyconsole)它无法执行。而是打印mysql用法选项,就像将一些未知命令传递给mysql一样。

// Groovy控制台

def p1 = 'mysql -h localhost -u root my_database -e "select count(*) from page;"'.execute()
p1.text

任何人都知道这是怎么回事?

1 个答案:

答案 0 :(得分:6)

不确定为什么会摔倒,我的猜测是mysql在引号中处理select调用的方式......

作为一种解决方法,这可行:

[ 'mysql', 
  '-h', 'localhost',
  '-u', 'root',
  'my_database',
  '-e', 'select count(*) from page' ].execute().text

处理输出的一种更好的方法是使用它(而不是使用text),因为这可以减轻缓冲区填满时的任何阻塞问题....

类似的东西:

String output = new StringWriter().with { writer ->
  [ 
    'mysql', 
    '-h', 'localhost',
    '-u', 'root',
    'my_database',
    '-e', 'select count(*) from page'
  ].execute().with { proc ->
    consumeProcessOutput( writer, writer )
    waitFor()
  }
  writer.toString() 
}

println output

编辑:

当然,你总是可以使用JDBC:

@GrabConfig(systemClassLoader=true)
@Grab('mysql:mysql-connector-java:5.1.21')
import groovy.sql.Sql

def rowcount = Sql.newInstance( 'jdbc:mysql://localhost/my_database', 'root', '', 'com.mysql.jdbc.Driver' ).with { sql ->
  def count = sql.firstRow( 'select count(*) from page' )[ 0 ]
  sql.close()
  count
}

println rowcount

解释

如果您编写这样的shell脚本(并将其保存为/tmp/run.sh):

#!/bin/bash

for var in "$@"
do
  echo "$var"
done

然后,当你跑:

println( '/tmp/run.sh "select count(*) from page"'.execute().text )

groovy calls Runtime.getRuntime.exec()的简单形式,打印出来:

"select
count(*)
from
page;"

正如您所看到的,参数变得混乱,因为它将select位分隔为单词。

当您改为致电时:

println( [ '/tmp/run.sh', '"select count(*) from page"' ].execute().text )

打印出来:

"select count(*) from page"

作为groovy calls String[] form of Runtime.exec所以java不必猜测不同的参数是什么,因此将select全部保存在一个参数中。

希望这能解释它: - )