Scala 包含一个进程库,简化了与外部进程的交互。使用 import scala.sys.process._ 将隐式转换引入作用域。
要运行外部命令,请在命令后添加感叹号 !
"find project -name *.jar" !
一个隐式转换将 String 转换为 scala.sys.process.ProcessBuilder,该类定义了 ! 方法。此方法运行构造的命令,等待命令完成,然后返回退出代码。或者,ProcessBuilder 上定义的 run 方法运行命令并返回 scala.sys.process.Process 的实例,该实例可用于在命令完成之前 destroy 进程。如果没有参数,! 方法将输出发送到标准输出和标准错误。您可以将 Logger 传递给 ! 方法,将输出发送到 Logger
"find project -name *.jar" ! log
您可以通过以下方式获取 Logger
val log = streams.value.log
如果需要设置工作目录或修改环境,请显式调用 scala.sys.process.Process,首先传递命令序列(命令和参数列表)或命令字符串,然后传递工作目录。任何环境变量都可以作为键/值字符串对的变长参数列表传递。
Process("ls" :: "-l" :: Nil, Path.userHome, "key1" -> value1, "key2" -> value2) ! log
定义了操作符来组合命令。这些操作符以 # 开头,以便保持优先级相同,并将其与 sbt 中其他地方为过滤器定义的操作符区分开来。在以下操作符定义中,a 和 b 是子命令。
a #&& b 执行 a。如果退出代码非零,则返回该退出代码,不执行 b。如果退出代码为零,则执行 b 并返回其退出代码。a #|| b 执行 a。如果退出代码为零,则返回零作为退出代码,不执行 b。如果退出代码非零,则执行 b 并返回其退出代码。a #| b 执行 a 和 b,将 a 的输出管道到 b 的输入。还定义了操作符用于将输出重定向到 File 和从 File 和 URL 中获取输入。在以下定义中,url 是 URL 的实例,file 是 File 的实例。
a #< url 或 url #> a 使用 url 作为 a 的输入。a 可以是文件或命令。a #< file 或 file #> a 使用 file 作为 a 的输入。a 可以是文件或命令。a #> file 或 file #< a 将 a 的输出写入 file。a 可以是文件、URL 或命令。a #>> file 或 file #<< a 将 a 的输出追加到 file。a 可以是文件、URL 或命令。还有一些其他方法可以将分叉进程的输出获取到 String 中,或将输出行作为 Stream[String] 获取。以下是一些示例,但请参阅 ProcessBuilder API 获取详细信息。
val listed: String = "ls" !!
val lines2: Stream[String] = "ls" lines_!
最后,有一个 cat 方法将 File 和 URL 的内容发送到标准输出。
将 URL 下载到 File
url("http://databinder.net/dispatch/About") #> file("About.html") !
// or
file("About.html") #< url("http://databinder.net/dispatch/About") !
复制 File
file("About.html") #> file("About_copy.html") !
// or
file("About_copy.html") #< file("About.html") !
通过 grep 过滤后,将 URL 的内容追加到 File
url("http://databinder.net/dispatch/About") #> "grep JSON" #>> file("About_JSON") !
// or
file("About_JSON") #<< ( "grep JSON" #< url("http://databinder.net/dispatch/About") )  !
在源代码目录中搜索 null 的用法
"find src -name *.scala -exec grep null {} ;"  #|  "xargs test -z"  #&&  "echo null-free"  #||  "echo null detected"  !
使用 cat
val spde = url("http://technically.us/spde/About")
val dispatch = url("http://databinder.net/dispatch/About")
val build = file("project/build.properties")
cat(spde, dispatch, build) #| "grep -i scala" !