我有一个shell脚本 mysql --local-infile = 1 -h myhost -P myport -u me< ./loader_file.sql
当我在命令行中直接运行它时,效果很好。数据被加载到数据库中。
但在scala代码中
val myScript = "mysql --local-infile=1 -h myhost -P myport -u me" #< "loader_file.sql"
myScript !
我收到一条错误消息,说明我的shell中的mysql命令,例如&#34;使用&#34;和#34;加载&#34;找不到。显然,shell将loader_file.sql解释为bash命令而不是mysql命令。
但如果我将整个字符串合并为一个命令
val myScript = "mysql --local-infile=1 -h myhost -P myport -u me < loader_file.sql"
然后我得到一个带有所有有效选项的mysql转储。显然,mysql认为我正在为它提供非法的输入参数。
任何人都知道如何解决这个问题?
答案 0 :(得分:1)
以下是您需要从scala代码执行此操作:
import scala.sys.process._
val cmd = Seq("bash","-c","mysql --local-infile=1 -h myhost -P myport -u me < loader_file.sql")
for( line <- cmd.lineStream_! ){
printf("%s\n",line)
}
这应该适用于linux,OSX,cygwin或类似的(听起来你有这样的环境之一,因为存在bash)。
此特定主题有很多变体,允许您设置默认工作目录,指定环境变量,单独处理STDOUT和STDERR流,以及捕获返回值等。
除了指定环境变量之外,这是一个执行所有操作的版本:
import scala.sys.process._
val cmd = Seq("bash","-c","command with args, blah, blah, blah")
val proc = Process( cmd, new java.io.File(".") )
val exitValue = proc ! ProcessLogger (
(out) => System.out.printf("stdout:%s\n",out)
,
(err) => System.err.printf("stderr:%s\n",err)
)
printf("exit value: %d\n",exitValue)
scala.sys.process的文档非常好,虽然它假设是linux类型的环境。 shell命令行有时会工作而不用Seq(“bash”,“ - c”,...)包装,但它不是可移植的(例如,Windows java不会将命令行传递给bash)