简介html
scala.sys.process
提供了shell的和系统交互的DSL,包括执行命令, 逻辑操做, 重定向, 管道等操做。java
启动流程
要执行与ProcessBuilder关联的全部外部命令,scala.sys.process提供了四组方法中。 这些方法中的每一种都具备各类过载和变化,以实现对I/O的进一步控制。
这四种方法以下:linux
"find /tmp -name *.jar".run()
"find /tmp -name *.jar" ! 若是没有参数,直接输出到标准输出或者标准错误输出. 同时能够传递Logger参数给!. import scala.sys.process._ var normalLines = 0 var errorLines = 0 val countLogger = ProcessLogger(line => normalLines += 1,line => errorLines += 1) "find /etc" ! countLogger 保存到变量中(返回最后命令运行的状态) val result: Int = "find /tmp -name *.jar" !
"find project -name *.jar".!! 保存到变量中(保存输出内容) val result :String = "find project -name *.jar" !!
获取该流的下一个元素可能会阻塞,直到它变为可用。 若是返回码不为零,此方法将抛出异常shell
val contents: Stream[String] = Process("ls").lineStream
注:若是不须要,请使用lineStream_! 方法。ruby
val etcFiles = "find /etc" lines_! ProcessLogger(line => ())
处理输入和输出网络
ProcessBuilder
这些ProcessBuilder以三种不一样的方式组合。ui
例如:url
它们能够并行执行,第一个输出做为输入提供给第二个,就像Unix管道同样。 这是经过#|实现的方法。spa
"ls" #| "grep linux"
它们能够按顺序执行,第二次结束后第二次启动。 这是经过###方法完成的。.net
"ls" ### "grep linux"
第二个的执行能够经过第一个的返回代码(退出状态)来调节,或者仅在它为零时,或者仅在它不为零时。 方法 #&& 和 #|| 完成这些任务
import scala.sys.process._ "find src -name *.scala -exec grep null {} ;" #| "xargs test -z" #&& "echo null-free" #|| "echo null detected" !
重定向
scala的重定向不只能够从定向普通的文件,还能够把网络上的文件进行重定向到本地:
a #< url or url #> a 例子: url("http://fuliang.iteye.com") #> file("blog.html") ! 或者 file("blog.html") #< url("http://fuliang.iteye.com") ! 注: 示例中的url和file均需进行封装,具体以下: new java.net.URL("http://www.baidu.com") #> new java.io.File("/tmp/baidu.html") !
注意,重定向必须用 new java.io.File("")封装,不然会看成命令,好比"ls" #> "/tmp/a" !将会出错,必须scala> "ls" #> new java.io.File("/tmp/a") !
文件:
a #< file or file #> a a能够是一个文件或者一个命令,好比: file("blog.html") #> file("fuliang_blog.html") ! 或者 file("fuliang_blog.html") #< file("blog.html") !
追加操做 #>>, #<<
a #>> file or file #<< url("http://fuliang.iteye.com") #> "grep -i ruby" #>> file("Ruby") ! 或者 file("Ruby") #<< ( "grep ruby" #< url(http://fuliang.iteye.com") ) !
与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" !
最后:! 最后执行命令,并返回退出值。 不管打印什么都将发送到Scala过程标准输出。 若是咱们想捕捉它,咱们能够用 !! 代替
注意:lines方法虽然已弃用,但可能与同名的StringLike方法冲突。 为避免这种状况,可能但愿在进程中调用构建器而不是导入scala.sys.process._。 上面的例子是import scala.sys.process.ProcessProcess("find src -name *.scala -exec grep null {} ;") #| Process("xargs test -z") #&& Process("echo null-free") #|| Process("echo null detected") !