1. 外部进程

外部进程 

用法 

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 中其他地方为过滤器定义的操作符区分开来。在以下操作符定义中,ab 是子命令。

  • a #&& b 执行 a。如果退出代码非零,则返回该退出代码,不执行 b。如果退出代码为零,则执行 b 并返回其退出代码。
  • a #|| b 执行 a。如果退出代码为零,则返回零作为退出代码,不执行 b。如果退出代码非零,则执行 b 并返回其退出代码。
  • a #| b 执行 ab,将 a 的输出管道到 b 的输入。

还定义了操作符用于将输出重定向到 File 和从 FileURL 中获取输入。在以下定义中,urlURL 的实例,fileFile 的实例。

  • a #< urlurl #> a 使用 url 作为 a 的输入。a 可以是文件或命令。
  • a #< filefile #> a 使用 file 作为 a 的输入。a 可以是文件或命令。
  • a #> filefile #< aa 的输出写入 file。a 可以是文件、URL 或命令。
  • a #>> filefile #<< aa 的输出追加到 file。a 可以是文件、URL 或命令。

还有一些其他方法可以将分叉进程的输出获取到 String 中,或将输出行作为 Stream[String] 获取。以下是一些示例,但请参阅 ProcessBuilder API 获取详细信息。

val listed: String = "ls" !!
val lines2: Stream[String] = "ls" lines_!

最后,有一个 cat 方法将 FileURL 的内容发送到标准输出。

示例 

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" !