2016-01-21 29 views
0

我有一個外殼腳本 的MySQL --local-infile的= 1 -h爲myhost -P MyPort上-u我< ./loader_file.sql階系統調用到MySQL失敗

當我直接在命令行運行這,它的效果很好。數據被加載到數據庫中。

但Scala代碼

val myScript = "mysql --local-infile=1 -h myhost -P myport -u me" #< "loader_file.sql" 
myScript ! 

我得到一個錯誤信息說我在外殼MySQL的命令,如「使用」和「負荷」裏面都沒有找到。顯然,shell將loader_file.sql解釋爲bash命令,而不是mysql命令。

但如果我納入整個字符串作爲一個命令

val myScript = "mysql --local-infile=1 -h myhost -P myport -u me < loader_file.sql" 

然後我得到一個MySQL轉儲其所有的有效選項。顯然,mysql認爲我餵它非法的輸入參數。

任何人都知道如何解決這個問題?

+0

我知道了將整個myScript字符串封裝到一個shell腳本myscript.sh中,然後調用myscript.sh!我很好奇,但如果有一種方法可以直接調用它。所以我會把這個開放給任何知道這一點的人。 – bhomass

+0

必須是在這個問題相同的問題:http://stackoverflow.com/questions/21247653/using-scala-sys-process-with-curl-single-quotes-and-white-space(見我的答案)。此外,所有這些特殊的管道符號都是特定於外殼的,可能無法正確擴展。 –

回答

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不會將命令行傳遞給bash) 。