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