不知道为什么它会倒下,我猜这是mysql处理引号中的选择调用的方式......
作为一种解决方法,这有效:
[ '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 调用的简单形式Runtime.getRuntime.exec(),并打印出:
"select
count(*)
from
page;"
正如你所看到的,参数都搞砸了,因为它将select位分隔成单词。
当您改为致电时:
println( [ '/tmp/run.sh', '"select count(*) from page"' ].execute().text )
它打印出来:
"select count(*) from page"
由于groovy调用的String[]形式,Runtime.exec所以java不必猜测不同的参数是什么,所以保持selectall in one参数。
希望这能解释它:-)