我在终端中执行此命令,它运行正常:
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
为什么我在这里看到不同的行为?
答案 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").!!