简介

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 =
var errorLines =
val countLogger = ProcessLogger(line => normalLines += ,line => errorLines += )
"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") !

scala调用系统-scala.sys.process使用的更多相关文章

  1. scala调用外部命令

     scala调用外部命令 1.  导入sys.process包 2. 调用方式:" 外部命令 " !     双引号内+外部命令+感叹号 例:     scala调用外部命令工作原 ...

  2. scala调用Linux命令行

    在 scala 里面存在 调用 Linux 命令行的函数: import scala.sys.process._ 执行的方法也不难: import scala.sys.process._ /** * ...

  3. 系统模块 sys 函数的调用

    系统模块 sys 运行时系统相关的信息 sys模块的数据 数据 描述 sys.path 模块搜索路径 path[0] 是当前脚本程序的路径名,否则为 '' sys.modules 已加载模块的字典 s ...

  4. [Scala] 快学Scala A1L1

    基础 1.1 声明值和变量 在Scala中,鼓励使用val; 不需要给出值或变量的类型,这个信息可以从初始化表达式推断出来.在必要的时候,可以指定类型. 在Scala中,仅当同一行代码中存在多条语句时 ...

  5. Scala学习(一)--Scala基础学习

    Scala基础学习 摘要: 在篇主要内容:如何把Scala当做工业级的便携计算器使用,如何用Scala处理数字以及其他算术操作.在这个过程中,我们将介绍一系列重要的Scala概念和惯用法.同时你还将学 ...

  6. Scala具体解释---------Scala是什么?可伸展的语言!

    Scala是什么 Scala语言的名称来自于"可伸展的语言". 之所以这样命名,是由于他被设计成随着使用者的需求而成长.你能够把Scala应用在非常大范围的编程任务上.从写个小脚本 ...

  7. [Scala] java使用scala的jar包问题:Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Short

    场景 刚写的scala处理bmp文件的实验, 打了jar包让java调用一下, 结果发生这个错误. package org.tanglizi.bmp.demo; import org.tanglizi ...

  8. java.lang.String cannot be cast to scala.runtime.Nothing Scala中的Nothing类型

    经常在写Rdd的时候, 如:  val OWNER_ID=row.getAs("OWNER_ID")  等, 运行是可能会报异常 : java.lang.String cannot ...

  9. Visual studio之C# 调用系统软键盘(外部"osk.exe")

    背景 App需要调用系统软键盘输入数据,自己去实现软键盘有些复杂,现在又是急需,没时间去研究实现软键盘,所以只能调用系统软键盘. 正文 需要添加命名空间, using System.Diagnosti ...

随机推荐

  1. python 装饰器 第二步:扩展函数的功能(不修改原函数)

    # 第二步:扩展函数的功能(不能修改原函数) # 用于扩展基本函数的函数 # 把一个函数(eat函数)作为一个整体传给另外一个函数(kuozhan函数) # 这个函数(kuozhan函数)用形参fun ...

  2. 常用开发类库支持--UUID及空值处理Optional

    一.java常用类库--UUID --UUID类库的使用非常简单,只需要使用静态方法UUID.randomUUID(就可以正常使用) public class MyUUID { public stat ...

  3. spring boot 多环境(dev、test、prod)配置文件---命令行切换

    properties配置格式 在Spring boot 中多环境配置文件名需要满足application-{profile}.properties的格式,其中{profile}对于你的环境标识,比如: ...

  4. POJ:3371 Connect the Cities(最小生成树)

    http://acm.hdu.edu.cn/showproblem.php?pid=3371 AC代码: /** /*@author Victor /* C++ */ #include <bit ...

  5. 对象和数据库的天然阻抗 转摘于:http://www.jdon.com/mda/oo-reltaion2.html

    在“面向对象建模与数据库建模两种分析设计方法的比较”一文中我们比较了在对需求分析时两种方法的不同,所谓数据库建模分析,就是项目一开始就根据需求建立数据库模型,如数据表结构和字段等,这种错误现象大量普遍 ...

  6. Java面试宝典(7)混合2

    数据库 & XML & 流行的框架与新技术 & 软件工程与设计模式 & J2EE & EBJ & webservice & 其他 pageSiz ...

  7. 记一次CentOS7进单用户模式修改密码的失败经历(faild to load SELinux policy freezing)

    背景:Cent SO7.4root用户密码忘记,根据https://www.linuxidc.com/Linux/2016-08/134034.htm提供的放法修改完密码之后系统启动后一直停留在转圈的 ...

  8. 【转】优秀的Vue UI组件库

    原文来源:https://www.leixuesong.com/3342 Vue 是一个轻巧.高性能.可组件化的MVVM库,API简洁明了,上手快.从Vue推出以来,得到众多Web开发者的认可.在公司 ...

  9. linux随笔-05

    shell脚本&定时任务 编写Shell脚本 可以将Shell终端解释器当作人与计算机硬件之间的“翻译官”. Shell脚本命令的工作方式有两种:交互式和批处理. 交互式(Interactiv ...

  10. 前端学习(三十一)canvas(笔记)

    canvas             画布    画图.做动画.做游戏===========================================    canvas就是新标签 必须获取绘图 ...