Scala系统命令的工作方式与命令行不同

时间:2017-07-31 19:09:18

标签: scala

我在终端中执行此命令,它运行正常:

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

另一方面,执行事情似乎并不适用于Scala:

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

为什么我在这里看到不同的行为?

1 个答案:

答案 0 :(得分:7)

根据scala.sys.process的文档,字符串的执行假定参数由空格分隔,并且无法转义嵌入空格。

  

运行什么以及如何

     

...

     

隐式地,每个进程都是用String创建的,参数用空格分隔 - 不能转义空格 - 或者scala.collection.Seq,其中第一个元素代表命令名,并且剩下的元素是它的参数。在后一种情况下,参数可能包含空格。

您的curl请求正文参数包含嵌入空格,因此假设它们是多个以空格分隔的参数。由于没有可能的转义,您必须将其作为Seq执行,而每个元素都明确指定存在新参数的位置以及带有嵌入空格的单个参数。

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