2017-07-31 102 views
1

我在執行這個終端指令,它只是罰款不同的工作:斯卡拉系統命令從命令行

curl -d "sentence=Jack sold the car to Jenny" austen.cs.illinois.edu:8082/parse 

在另一方面執行的事情似乎並沒有在斯卡拉奏效:

import sys.process._ 
val output = s"""curl -d \"sentence=Jack sold the car to Jenny\" austen.cs.illinois.edu:8082/parse""".!! 
println(output.split("\t")) 

,輸出:

[error] % Total % Received % Xferd Average Speed Time Time  Time Current 
[error]         Dload Upload Total Spent Left Speed 
[error] 
[error] 0  0 0  0 0  0  0  0 --:--:-- --:--:-- --:--:--  0curl: (6) Could not resolve host: sold 
[error] curl: (6) Could not resolve host: the 
[error] 
[error] 0  0 0  0 0  0  0  0 --:--:-- --:--:-- --:--:--  0curl: (6) Could not resolve host: car 
[error] curl: (6) Could not resolve host: to 
[error] curl: (6) Could not resolve host: Jenny" 
[error] 
[error] 100 37 100 23 100 14 153  93 --:--:-- --:--:-- --:--:-- 153 

思考爲什麼我在這裏看到不同的行爲?

回答

5

根據scala.sys.process的文檔,字符串的執行假定參數由空格分隔,並且無法轉義嵌入的空格。

什麼運行和如何

...

含蓄,創建一個進程或者一個字符串,具有以空格分隔參數 - 無空格轉義是可能的 - - 或者出自scala.collection.Seq,其中第一個元素表示命令名稱,其餘元素是它的參數。在後一種情況下,參數可能包含空格。

您的curl請求body參數包含嵌入的空格,因此它假定它們是多個空格分隔的參數。由於沒有可能的轉義,因此您必須將其作爲Seq來代替執行,每個元素明確指定存在新參數的位置以及包含嵌入空格的單個參數。

val output = Seq("curl", "-d", "sentence=Jack sold the car to Jenny", "austen.cs.illinois.edu:8082/parse").!!