zoukankan      html  css  js  c++  java
  • scala调用系统-scala.sys.process使用

    简介

    scala.sys.process提供了shell的和系统交互的DSL,包括执行命令, 逻辑操作, 重定向, 管道等操作。

    启动流程
    要执行与ProcessBuilder关联的所有外部命令,scala.sys.process提供了四组方法中。 这些方法中的每一种都具有各种过载和变化,以实现对I/O的进一步控制。
    这四种方法如下:

    • run:最通用的方法,它立即返回一个scala.sys.process.Process,并且外部命令同时执行。
    "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" !
    • !!:阻塞直到所有外部命令都退出,并返回一个生成输出的String。
    "find project -name *.jar".!!
    保存到变量中(保存输出内容)
    val result :String = "find project -name *.jar" !!
    • lineStream:像run一样立即返回,生成的输出通过Stream [String]提供。

    获取该流的下一个元素可能会阻塞,直到它变为可用。 如果返回码不为零,此方法将抛出异常

    val contents: Stream[String] = Process("ls").lineStream

    注:如果不需要,请使用lineStream_! 方法。

    val etcFiles = "find /etc" lines_! ProcessLogger(line => ())

    处理输入和输出

    • 如果未指定,则使用run或!执行外部命令的输入。 不会绑定任何东西,输出将被重定向到Scala进程的stdout和stderr。
    • 对于方法!! 和lines,不提供输入,输出将根据这些方法的语义进行定向。

    Combining ProcessBuilder

    这些ProcessBuilder以三种不同的方式组合。

    • #|      将第一个命令的输出传递给第二个命令的输入。 它镜像一个shell管(|)
    • #&&  有条件地执行第二个命令,如果前一个命令以退出值0结束。它镜像shell的&&
    • #||     如果前一个命令的退出值不为零,则有条件地执行第三个命令。 它镜像shell的||

    例如:

    它们可以并行执行,第一个输出作为输入提供给第二个,就像Unix管道一样。 这是通过#|实现的方法。

    "ls" #| "grep linux"

    它们可以按顺序执行,第二次结束后第二次启动。 这是通过###方法完成的。

    "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.Process
    Process("find src -name *.scala -exec grep null {} ;") #| Process("xargs test -z") #&& Process("echo null-free") #|| Process("echo null detected") !

  • 相关阅读:
    tyvj1034 尼克的任务
    一维数状数组区间修改,查询
    ACM-T3分块
    测试2T3
    IOS下自定义click事件使用alert的bug
    小知识点
    CSS3动画基本知识
    CSS3秘笈:第十二章&第十三章
    CSS3秘笈:第十一章
    CSS3秘笈:第十章
  • 原文地址:https://www.cnblogs.com/yyy-blog/p/11483363.html
Copyright © 2011-2022 走看看